python-numpy中nonzero()的用法

當使用布爾數組直接作爲下標對象或者元組下標對象中有布爾數組時,都相當於用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]])
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章