比较两个以上的numpy数组

问题描述 投票:2回答:2

我想要一个布尔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不会这样做,或者至少我无法理解。

python arrays numpy boolean
2个回答
1
投票

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

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.