比较两个以上的numpy数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较两个以上的numpy数组相关的知识,希望对你有一定的参考价值。

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

答案

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

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

让我们首先将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)

以上是关于比较两个以上的numpy数组的主要内容,如果未能解决你的问题,请参考以下文章

按元素比较两个 NumPy 数组的相等性

比较 NumPy 数组以便 NaN 比较相等

python使用numpy中的equal函数比较两个numpy数组中每个位置的元素是否相同并计算相同元素的比例

如何比较忽略nans的numpy数组? [复制]

NumPy迭代数组

Python\Numpy:将数组与 NAN 进行比较 [重复]