In [45]: a
Out[45]:
array([[1, 1, 0],
[1, 0, 0],
[1, 0, 0],
[1, 1, 0]])
Compare each value to the corresponding value in the first row:
In [46]: a == a[0,:]
Out[46]:
array([[ True, True, True],
[ True, False, True],
[ True, False, True],
[ True, True, True]], dtype=bool)
A column shares a common value if all the values in that column are True:
In [47]: np.all(a == a[0,:], axis = 0)
Out[47]: array([ True, False, True], dtype=bool)
The problem with np.equal.reduce
can be seen by micro-analyzing what happens when it is applied to [1, 0, 0, 1]
:
In [49]: np.equal.reduce([1, 0, 0, 1])
Out[50]: True
The first two items, 1
and 0
are tested for equality and the result is False
:
In [51]: np.equal.reduce([False, 0, 1])
Out[51]: True
Now False
and 0
are tested for equality and the result is True
:
In [52]: np.equal.reduce([True, 1])
Out[52]: True
But True
and 1 are equal, so the total result is True
, which is not the desired outcome.
The problem is that reduce
tries to accumulate the result "locally", while we want a "global" test like np.all
.