numpy中的nonzero()的用法
阿新 • • 發佈:2019-01-04
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]]