1. 程式人生 > >numpy中的nonzero()的用法

numpy中的nonzero()的用法

       nonzero(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], dtype=int64),)
對於二維陣列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], dtype=int64), array([0, 2, 0], dtype=int64))
當布林陣列直接做為numpy陣列下標時,相當於使用由nonzero()轉換之後的元組作為下標物件:
>>> a = np.arange(3*4*5).reshape(3,4,5)
>>> a
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])
>>> 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]])

為了觀察變化,下面有一個例子:

dataSet=array(
	[[1,0,0,0],
	[0,1,0,0],
	[0,1,0,0],
	[0,0,0,1]])
a=dataSet[:,1]>0.5
print(a)
print('--------------')
print(nonzero(a))
print('--------------')
print(nonzero(a)[0])
print('--------------')
print(dataSet[nonzero(a)[0],:])
輸出結果:
[False  True  True False]
--------------
(array([1, 2], dtype=int64),)
--------------
[1 2]
--------------
[[0 1 0 0]
 [0 1 0 0]]