我试图找出沿着第二个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导向。
答案 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])