當使用布爾數組直接作為下標對象或者元組下標對象中有布爾數組時,都相當於用nonzero()將布爾數組轉換成一組整數數組,然后使用整數數組進行下標運算。
nonzeros(a) 返回數組a中值不為零的元素的下標,它的返回值是一個長度為a.ndim(數組a的軸數)的元組,元組的每個元素都是一個整數數組,其值為非零元素的下標 在對應軸上的值。例如對於一維布爾數組b1,nonzero(b1)所得到的是一個長度為1的元組,它表示b1[0]和b1[2]的值不為 0(False)。
>>> b1 = np.array([True, False, True, False]) >>> np.nonzero(b1) (array([0, 2]),)
對於二維數組b2,nonzero(b2)所得到的是一個長度為2的元組。它的第0個元素是數組a中值不為0的元素的第0軸的下標,第1個元素則是第1軸的下標,因此從下面的結果可知b2[0,0]、b[0,2]和b2[1,0]的值不為0:
>>> b2 = np.array([[True, False, True], [True, False, False]]) >>> np.nonzero(b2) (array([0, 0, 1]), array([0, 2, 0]))
當布爾數組直接做為下標時,相當於使用由nonzero()轉換之后的元組作為下標對象:
>>> a = np.arange(3*4*5).reshape(3,4,5) >>> a[b2] array([[ 0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [20, 21, 22, 23, 24]]) >>> a[np.nonzero(b2)] array([[ 0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [20, 21, 22, 23, 24]])
當下標對象是元組,並且其中有布爾數組時,相當於將布爾數組展開為由nonzeros()轉換之后的各個整數數組:
>>> a[1:3, b2] array([[20, 22, 25], [40, 42, 45]]) >>> a[1:3, np.nonzero(b2)[0], np.nonzero(b2)[1]] array([[20, 22, 25], [40, 42, 45]])