我想检查 numpy 数组/矩阵列中的所有值是否相同。我尝试使用reduceufunc ,但它似乎并不在所有情况下都有效: equal
reduce
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?
True
False
谢谢你的帮助!
你的问题在于 np.equal.reduce 方法。这个方法会对数组的列进行逐对比较,然后对这些比较结果进行归约(reduce),可能会导致中间的比较结果混淆,从而得到错误的最终结果。
np.equal.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)
a == a[0]
a
.all(axis=0)
对于你的例子:
# 示例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 都准确地反映了每列中所有值是否相同。这种方法避免了逐对比较的中间结果混淆问题,并且更直观易懂。
result