我想检查 numpy 数组/矩阵的列中的所有值是否相同。
我尝试使用 ufunc 的 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
?
感谢您的帮助!
最佳答案
In [45]: a
Out[45]:
array([[1, 1, 0],
[1, 0, 0],
[1, 0, 0],
[1, 1, 0]])
将每个值与第一行中的对应值进行比较:
In [46]: a == a[0,:]
Out[46]:
array([[ True, True, True],
[ True, False, True],
[ True, False, True],
[ True, True, True]], dtype=bool)
如果该列中的所有值都为 True,则该列共享一个公共(public)值:
In [47]: np.all(a == a[0,:], axis = 0)
Out[47]: array([ True, False, True], dtype=bool)
np.equal.reduce
的问题可以通过微分析应用于[1, 0, 0, 1]
时发生的情况来看出:
In [49]: np.equal.reduce([1, 0, 0, 1])
Out[50]: True
前两项 1
和 0
进行相等性测试,结果为 False
:
In [51]: np.equal.reduce([False, 0, 1])
Out[51]: True
现在 False
和 0
进行相等性测试,结果为 True
:
In [52]: np.equal.reduce([True, 1])
Out[52]: True
但是True
和1是相等的,所以总的结果是True
,并不是想要的结果。
问题是 reduce
试图在“本地”累积结果,而我们想要像 np.all
这样的“全局”测试。
关于python - 如何检查numpy矩阵的列中的所有值是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14859458/