簡體   English   中英

如何在numpy數組的每一列中找到第一個非零值?

[英]How to find first non-zero value in every column of a numpy array?

假設我有一個形式為 numpy 的數組:

arr=numpy.array([[1,1,0],[1,1,0],[0,0,1],[0,0,0]])

我想找到值不為零的第一個索引(對於每一列)的索引。

因此,在這種情況下,我希望返回以下內容:

[0,0,2]

我該怎么做?

首次出現的指標

np.argmax沿該軸(此處為列的零軸)使用np.argmax可獲得首個matches的索引(真值)-

(arr!=0).argmax(axis=0)

擴展到涵蓋通用軸說明符,並且在沿着該軸找不到元素的非零的情況下,我們將有一個類似的實現-

def first_nonzero(arr, axis, invalid_val=-1):
    mask = arr!=0
    return np.where(mask.any(axis=axis), mask.argmax(axis=axis), invalid_val)

注意,由於所有False值上的argmax()返回0 ,因此,如果所需的invalid_val0 ,我們將直接使用mask.argmax(axis=axis)獲得最終輸出。

樣品運行-

In [296]: arr    # Different from given sample for variety
Out[296]: 
array([[1, 0, 0],
       [1, 1, 0],
       [0, 1, 0],
       [0, 0, 0]])

In [297]: first_nonzero(arr, axis=0, invalid_val=-1)
Out[297]: array([ 0,  1, -1])

In [298]: first_nonzero(arr, axis=1, invalid_val=-1)
Out[298]: array([ 0,  0,  1, -1])

擴展到涵蓋所有比較操作

要找到第一個zeros ,只需將arr==0用作函數中的mask 對於等於某個特定值val第一個值,請使用arr == val ,依此類推,對於此處所有可能的comparisons情況。


最近一次出現的指標

要找到符合特定比較條件的最后一個,我們需要沿該軸翻轉並使用使用argmax的相同思想,然后通過偏離軸長來補償該翻轉,如下所示-

def last_nonzero(arr, axis, invalid_val=-1):
    mask = arr!=0
    val = arr.shape[axis] - np.flip(mask, axis=axis).argmax(axis=axis) - 1
    return np.where(mask.any(axis=axis), val, invalid_val)

樣品運行-

In [320]: arr
Out[320]: 
array([[1, 0, 0],
       [1, 1, 0],
       [0, 1, 0],
       [0, 0, 0]])

In [321]: last_nonzero(arr, axis=0, invalid_val=-1)
Out[321]: array([ 1,  2, -1])

In [322]: last_nonzero(arr, axis=1, invalid_val=-1)
Out[322]: array([ 0,  1,  1, -1])

同樣,使用相應的比較器獲取mask ,然后在列出的函數中使用,可以覆蓋所有可能的comparisons情況。

這是使用numpy.argwhere的替代方法,它返回數組的非零元素的索引:

array = np.array([0,0,0,1,2,3,0,0])

nonzero_indx = np.argwhere(array).squeeze()
start, end = (nonzero_indx[0], nonzero_indx[-1])
array[start:end]

給出:

array([1, 2])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM