Numpy索引:设置由不同数组中的条件给出的数组的值

时间:2016-08-28 20:59:01

标签: python numpy indexing

我想将数组的所有值设置为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 个答案:

答案 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]]