Mathematica如何使用纯函数筛选元素
比如有一个列表{1,2,8,3,9,4,10,5,6,7},我想把8,9,10这三个明显出错(就是和其余元素的趋势不同)的点给去除掉,想用Select函数,在参考资料中心...
比如有一个列表{1, 2, 8, 3, 9, 4, 10, 5, 6, 7},我想把8,9,10这三个明显出错(就是和其余元素的趋势不同)的点给去除掉,想用Select函数,在参考资料中心看到Select函数可以用纯函数来定义选取规则,但是范例中规则每次只用到一个元素,比如Select[{1, 2, 4, 7, 6, 2}, # > 2 &]表示把所有大于2的取出来,但如果我想定义一个规则,让所有与前后的数相差超过1的元素(这里是8,9,10这三个元素)给剔除,需要怎么写这个规则?
我的尝试:
test = {1, 2, 8, 3, 9, 4, 10, 5, 6, 7}
criterion=Table[Abs[test[[#1]] - test[[#2]] &[i, i + 1]] <= 1, {i, 1, 9}]
Select[test,criterion]
这里我只比较了第i个元素和第i+1个元素的差值的绝对值,但是Select函数没有返回任何元素,不知道哪里错了 求教 展开
我的尝试:
test = {1, 2, 8, 3, 9, 4, 10, 5, 6, 7}
criterion=Table[Abs[test[[#1]] - test[[#2]] &[i, i + 1]] <= 1, {i, 1, 9}]
Select[test,criterion]
这里我只比较了第i个元素和第i+1个元素的差值的绝对值,但是Select函数没有返回任何元素,不知道哪里错了 求教 展开
1个回答
展开全部
Select 函数不能以直接以索引 True 或 False 的列表来选择元素,函数 Pick 是可以这样使用的。但是有一点是必须注意的就是 在使用 Pick 的时候,"选择" 列具有和数据列相同的长度和结构,也就是你的尝试中,test 和 criterion 的长度必须相同,但你的程序中,test 的长度是 10,而 criterion 的长度却为 9。
下面是我写的完整的代码,仅供参考。
Select[Partition[test, 3, 1, {2, 2}, {test[[-1]], test[[1]]}], 3*#[[2]] - Plus @@ # <= 2 &] /. {a_, b_, c_} -> b
下面是我写的完整的代码,仅供参考。
Select[Partition[test, 3, 1, {2, 2}, {test[[-1]], test[[1]]}], 3*#[[2]] - Plus @@ # <= 2 &] /. {a_, b_, c_} -> b
更多追问追答
追问
但是如果criterion的长度变成10(也就是 i 赋值到10)的话,就会出现test[11],但是test只有10个元素。。。。所以我是要人为地再定义最后一个判定条件(比如说最后一个元素是否大于1)嘛。。那这样criterion就相当于分段了,分段的要如何定义?
追答
其实不需要分段定义的,直接在 criterion 的后面添加一个 判断条件即可,参见下面的语句。
Pick[test, Flatten@{criterion, test[[-1]] > 1}]
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询