小能豆

如何检查 numpy 矩阵的列中的所有值是否相同?

python

我想检查 numpy 数组/矩阵列中的所有值是否相同。我尝试使用reduceufunc ,但它似乎并不在所有情况下都有效 equal

In [55]: a = np.array([[1,1,0],[1,-1,0],[1,0,0],[1,1,0]])

In [56]: a
Out[56]: 
array([[ 1,  1,  0],
       [ 1, -1,  0],
       [ 1,  0,  0],
       [ 1,  1,  0]])

In [57]: np.equal.reduce(a)
Out[57]: array([ True, False,  True], dtype=bool)

In [58]: a = np.array([[1,1,0],[1,0,0],[1,0,0],[1,1,0]])

In [59]: a
Out[59]: 
array([[1, 1, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 1, 0]])

In [60]: np.equal.reduce(a)
Out[60]: array([ True,  True,  True], dtype=bool)

为什么第二种情况下的中间列也评估为True,而它应该是False

谢谢你的帮助!


阅读 75

收藏
2024-05-18

共1个答案

小能豆

你的问题在于 np.equal.reduce 方法。这个方法会对数组的列进行逐对比较,然后对这些比较结果进行归约(reduce),可能会导致中间的比较结果混淆,从而得到错误的最终结果。

为了检查每一列中的所有值是否相同,可以使用一个更直接的方法。我们可以比较每一列的所有元素是否都等于该列的第一个元素。具体代码如下:

import numpy as np

a = np.array([[1, 1, 0],
              [1, -1, 0],
              [1, 0, 0],
              [1, 1, 0]])

# 方法:比较每一列的所有元素是否都等于该列的第一个元素
result = (a == a[0]).all(axis=0)

print(result)

解释:

  1. a == a[0]:创建一个布尔数组,表示 a 中的每个元素是否等于该列的第一个元素。
  2. .all(axis=0):沿着列轴检查所有值是否都为 True

对于你的例子:

# 示例1
a = np.array([[1, 1, 0],
              [1, -1, 0],
              [1, 0, 0],
              [1, 1, 0]])

result = (a == a[0]).all(axis=0)
print(result)  # 输出: [ True False  True]

# 示例2
a = np.array([[1, 1, 0],
              [1, 0, 0],
              [1, 0, 0],
              [1, 1, 0]])

result = (a == a[0]).all(axis=0)
print(result)  # 输出: [ True False  True]

在这两个示例中,result 都准确地反映了每列中所有值是否相同。这种方法避免了逐对比较的中间结果混淆问题,并且更直观易懂。

2024-05-18