鉴于 ubuntu 的精彩解释,您可以使用它reduce
来解决您的问题,但您必须将其应用于bitwise_and
andbitwise_or
而不是equal
. 因此,这不适用于浮点数组:
In [60]: np.bitwise_and.reduce(a) == a[0]
Out[60]: array([ True, False, True], dtype=bool)
In [61]: np.bitwise_and.reduce(b) == b[0]
Out[61]: array([ True, False, True], dtype=bool)
基本上,您正在比较列中每个元素的位。相同的位不变。不同的位设置为零。这样,任何具有零而不是一位的数字都会改变减少的值。bitwise_and
不会捕获引入而不是删除位的情况:
In [62]: c = np.array([[1,0,0],[1,0,0],[1,0,0],[1,1,0]])
In [63]: c
Out[63]:
array([[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
[1, 1, 0]])
In [64]: np.bitwise_and.reduce(c) == c[0]
Out[64]: array([ True, True, True], dtype=bool)
第二个显然是错误的。我们需要用来bitwise_or
捕获新的位:
In [66]: np.bitwise_or.reduce(c) == c[0]
Out[66]: array([ True, False, True], dtype=bool)
最终答案
In [69]: np.logical_and(np.bitwise_or.reduce(a) == a[0], np.bitwise_and.reduce(a) == a[0])
Out[69]: array([ True, False, True], dtype=bool)
In [70]: np.logical_and(np.bitwise_or.reduce(b) == b[0], np.bitwise_and.reduce(b) == b[0])
Out[70]: array([ True, False, True], dtype=boo
In [71]: np.logical_and(np.bitwise_or.reduce(c) == c[0], np.bitwise_and.reduce(c) == c[0])
Out[71]: array([ True, False, True], dtype=bool)
这种方法比 ubunut 建议的 using 更具限制性且不那么优雅all
,但如果您的输入很大,它的优点是不会创建大量临时数组。临时数组应该只与矩阵的第一行一样大。
编辑
基于此Q/A和我使用 numpy 提交的错误,提供的解决方案仅有效,因为您的数组包含零和一。碰巧的是,bitwise_and.reduce()
显示的操作只能返回零或一,因为bitwise_and.identity
is 1
, not -1
。我保留这个答案,希望numpy
得到修复并且答案变得有效。
编辑
看起来实际上很快就会对 numpy 进行更改。当然 to bitwise_and.identity
,也可能是一个可选参数来减少。
编辑
大家好消息。的标识np.bitwise_and
已设置-1
为 version 1.12.0
。