I tried to test the usage of np.all, the test array a is
a=array([[[ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0]], [[ 0, 0, 255], [255, 255, 255], [ 0, 0, 0], [255, 0, 0]]])
b = [255,0,255]
c = np.all(a==b,axis=1)I got
c= array([[False, True, False], [False, False, False]], dtype=bool)I don't understand how was TRUE in c obtained from running np.all(a==b,axis=1).
2 Answers
Since you are calling np.all() with axis=1, a logical AND will be performed over the first dimension i.e. all the columns (numbering starts from zero).
Your array is:
a = np.array([[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 255], [255, 0, 255], [0, 0, 0], [255, 255, 0]]])So, the first column of a i.e. [0, 0, 0, 0] and the first element of b i.e. 255 will go through an AND operation, giving the result False. All operations are given below:
[0, 0, 0, 0] & 255 => False
[0, 0, 0, 0] & 0 => True
[0, 0, 0, 0] & 255 => False
[0, 255, 0, 255] & 255 => False
[0, 255, 0, 0] & 0 => False
[255, 255, 0, 0] & 255 => FalseThis will give the end result of:
[[False True False] [False False False]]Since, you are not passing the keepdims=True parameter, the resulting list is of shape [2, 3] i.e. from [2, 4, 3] and [1, 1, 3] (see NumPy broadcasting rules), the operation is performed on index=1. Otherwise, the result would be of shape [2, 1, 3].
The key is understanding how b broadcasts with a.
a is (2,4,3) (I like the different dimensions).
b is (3,), which broadcasts to (1,1,3).
In [708]: a==b
Out[708]:
array([[[False, True, False], [False, True, False], [False, True, False], [False, True, False]], [[False, True, True], [ True, False, True], [False, True, False], [ True, True, False]]], dtype=bool)The all is applied on axis=1, the size 4 one (columns in the display). The result is then (2,3) shape.
The same broadcasting and axis reduction occurs in:
In [709]: (a+b).sum(axis=1)
Out[709]:
array([[1020, 0, 1020], [1530, 255, 1530]]) 0