找到第一个零元素,忽略numpy数组中的前导零

时间:2017-07-27 16:06:43

标签: python arrays numpy

我试图找出沿着第二个NumPy数组的第二轴找到第一个零元素的最快方法,忽略前导的零块。

例如,我有以下数组:

a = np.array([[ 0. ,  0. ,  0. ],
       [ 0. ,  3. ,  0. ],
       [ 2. ,  0. ,  0. ],
       [ 0. ,  1.7,  1.5],
       [ 1. ,  1.5,  1.6]])

我希望得到的是:

array([3, 2, 4])

实际上,忽略了所有前导零。 这可以通过for循环计算前导零的数量并随后切片每列来实现,但它看起来非常难看,而不是NumPy导向。

1 个答案:

答案 0 :(得分:1)

使用播放面具 -

def first_zero_index_along_cols(a):
    m1 = a==0
    m2 = (~m1).cumsum(0)>0
    mask = m1 & m2
    return np.where(mask.any(0), mask.argmax(0), a.shape[0]-1)

样品运行 -

案例#1:

In [503]: a
Out[503]: 
array([[ 0. ,  0. ,  0. ],
       [ 0. ,  3. ,  0. ],
       [ 2. ,  0. ,  0. ],
       [ 0. ,  1.7,  1.5],
       [ 1. ,  1.5,  1.6]])

In [504]: first_zero_index_along_cols(a)
Out[504]: array([3, 2, 4])

案例#2:

In [505]: a[2:,1] = 0

In [506]: a
Out[506]: 
array([[ 0. ,  0. ,  0. ],
       [ 0. ,  3. ,  0. ],
       [ 2. ,  0. ,  0. ],
       [ 0. ,  0. ,  1.5],
       [ 1. ,  0. ,  1.6]])

In [507]: first_zero_index_along_cols(a)
Out[507]: array([3, 2, 4])

案例#3:

In [508]: a[:,1] = 0

In [509]: a
Out[509]: 
array([[ 0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ],
       [ 2. ,  0. ,  0. ],
       [ 0. ,  0. ,  1.5],
       [ 1. ,  0. ,  1.6]])

In [510]: first_zero_index_along_cols(a)
Out[510]: array([3, 4, 4])