比较两个以上的numpy数组

时间:2018-08-31 11:38:28

标签: python arrays numpy boolean

我想要一个布尔numpy数组fixidx,它是比较numpy数组abcd的结果。例如我有数组

a = np.array([1, 1])
b = np.array([1, 2])
c = np.array([1, 3])
d = np.array([1, 4])

因此数组fixidx具有值

  

fixidx = [1,0]

我的方法是

fixidx = (a == b) & (b == c) & (c == d)

这在Matlab中有效,但事实证明Python仅输出ValueError。

  

ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()

anyall不会解决这个问题,或者至少我无法弄清楚。

2 个答案:

答案 0 :(得分:1)

代码完美无误。尝试将布尔输出转换为整数:

((a == b) & (b == c) & (c == d)).astype(int)
array([1, 0])

答案 1 :(得分:1)

让我们开始将abcd堆叠到单个数组x中:

In [452]: x = np.stack([a, b, c, d])

In [453]: x
Out[453]: 
array([[1, 1],
       [1, 2],
       [1, 3],
       [1, 4]])

然后,您可以将NumPy的unique应用于每一列,并测试结果是否包含一个或多个元素。

In [454]: fixidx = np.array([np.unique(x[:, i]).size == 1 for i in range(x.shape[1])])

In [455]: fixidx
Out[455]: array([ True, False])

最后,如有必要,可以将fixidx转换为整数:

In [456]: fixidx.astype(int)
Out[456]: array([1, 0])

或者,您可以通过NumPy的equal获得相同的结果,如下所示:

fixidx = np.ones(shape=a.shape, dtype=int)
x = [a, b, c, d]
for first, second in zip(x[:-1], x[1:]):
    fixidx *= np.equal(first, second)