使用numpy.where()时'in'的替代方法
假设我有一个数组,叫做'foo',里面有两列。第一列是从1到12的数字,表示月份;第二列是对应的测量值。如果我想要从中提取出12月、1月和2月(也就是12、1、2)的测量值,我本来以为可以这样做:
numpy.where(foo[:,1] in (12, 1, 2), False, True)
但是看起来我聪明的写法'in (12, 1, 2)'并不能作为where()的条件使用。用[12, 1, 2]这样的写法也不行……
有没有其他聪明的方法可以做到这一点?有没有更好的方法可以把所有的(12, 1, 2)的测量值收集到一个数组里?用numpy有什么好的办法吗?
(重新调整数组的形状是不可能的,因为每个月的测量值数量不规则)
1 个回答
4
我觉得' in (12, 1, 2)' 这个写法不管用的原因是,在'in'之前的元素必须是单个元素。
不过,numpy提供了一个叫 in1d
的函数(文档链接),可以用来在numpy数组中进行'in'操作。用你的代码:
np.where(np.in1d(foo[:,0], [12, 1, 2]), False, True)
为了补充评论的内容:在这种情况下,使用 where
是多余的,in1d
的输出可以直接用来索引foo:
foo[np.in1d(foo[:,0], [12, 1, 2])]
或者可以这样:
foo[~np.in1d(foo[:,0], [12, 1, 2])]
注意:in1d
这个函数只有在numpy 1.4或更高版本中才可用。