Numpy索引:根据不同数组中的条件设置数组的值

3
我希望您可以把一个数组中所有不在另一个数组中的值都设为0。
如果只有一个条件,那么很容易实现:
a = np.array([[1,2],[2,4],[5,6]])
cond = 1
a[a!=cond] = 0

如果我有一系列条件,例如:
cond = np.array([1,2,6])

我可以像这样写出来


a[(a!=1) & (a!=2) & (a!=6)]=0

但我无法找到一般的做法,类似于这样。
a[a!=cond] = 0

cond是一个数组时。我也看了np.select,但那似乎不是我需要的。

2个回答

5
解决方案的关键是: NOT(option1)& NOT(option2)& NOT(option3)等效于NOT(option1 | option2 | option3)
现在,要获取option1 | option2 | option3的掩码,我们有一个内置的np.in1d。 因此,基本上解决方案会像这样:~np.in1d(a,cond)。由于np.in1d适用于1D数组,在使用掩码将输入数组设置为零值之前,我们需要对其进行reshape。
因此,实现看起来会像这样 -
a[~np.in1d(a,cond).reshape(a.shape)] = 0

3

有一个函数叫做np.in1d,可以测试第一个数组是否包含第二个数组中的任何一个元素。
但是由于该函数只适用于一维数组,在二维数组上进行测试需要一些技巧,利用ravel()函数返回一个视图来实现:

a = np.array([[1,2],[2,4],[5,6]])
a.ravel()[~np.in1d(a.ravel(), [1, 2, 6])] = 0
print(a)

然后你会得到输出:
[[1 2]
 [2 0]
 [0 6]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接