Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy:如何在Numpy数组的每一列中找到第一个非零值?_Python_Numpy - Fatal编程技术网

Python Numpy:如何在Numpy数组的每一列中找到第一个非零值?

Python Numpy:如何在Numpy数组的每一列中找到第一个非零值?,python,numpy,Python,Numpy,假设我有一个如下形式的numpy数组: arr=numpy.array([[1,1,0],[1,1,0],[0,0,1],[0,0,0]]) 我想找到第一个索引的索引(对于每一列),其中的值是非零的 因此,在本例中,我希望返回以下内容: [0,0,2] 如何进行此操作?首次出现的索引 在非零掩码上沿该轴(此处列的第零轴)使用,以获得第一个匹配项的索引(真值)- 扩展到涵盖通用轴说明符,并且对于元素在该轴上找不到非零的情况,我们将有一个这样的实现- def first_nonzero(arr,

假设我有一个如下形式的numpy数组:

arr=numpy.array([[1,1,0],[1,1,0],[0,0,1],[0,0,0]])
我想找到第一个索引的索引(对于每一列),其中的值是非零的

因此,在本例中,我希望返回以下内容:

[0,0,2]
如何进行此操作?

首次出现的索引 在非零掩码上沿该轴(此处列的第零轴)使用,以获得第一个
匹配项的索引(真值)-

扩展到涵盖通用轴说明符,并且对于元素在该轴上找不到非零的情况,我们将有一个这样的实现-

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
,因此如果需要
无效值
0
,我们将直接使用
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])
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])
扩展以覆盖所有比较操作

要查找第一个
,只需在函数中使用
arr==0
作为
mask
。对于第一个值等于某个特定值的值
val
,在所有可能的情况下使用
arr==val
,依此类推


上次事件索引 要找到与特定比较标准匹配的最后一个,我们需要沿该轴翻转,并使用相同的想法使用
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 [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])
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])
同样,通过使用相应的比较器获取
掩码
,然后在列出的函数中使用,可以涵盖所有可能的情况