regarding the usage of np.all along with axis

Viewed 3400

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 => False

This 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]])
Related