我想将数组的所有值设置为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
,但似乎没有做我需要的。
答案 0 :(得分:5)
解决方案的关键是:
NOT( option1) & NOT(option2) & NOT(option3)
将等同于
NOT (option1 | option2 | option3 )
。
现在,要获取option1 | option2 | option3
的掩码,我们有一个内置的np.in1d
。所以,基本上解决方案有点像~np.in1d(a,cond)
。由于np.in1d
适用于一维数组,因此我们需要在使用输入数组上的掩码之前对其进行整形,以将值设置为零。
因此,实现看起来像这样 -
a[~np.in1d(a,cond).reshape(a.shape)] = 0
答案 1 :(得分:3)
嗯,有np.in1d
函数测试第一个阵列是否为
包含第二个数组中的任何项目。
但由于这适用于1d阵列,因此需要在2d阵列上进行测试
解决方案有点棘手,使用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]]