用相同的值在非零元素之间的numpy数组中填充零 [英] Filling zeros in numpy array that are between non-zero elements with the same value
本文介绍了用相同的值在非零元素之间的numpy数组中填充零的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个带有整数的一维numpy numpy数组,在这里,当且仅当下一个非零值相同时,我才想用先前的非零值替换零.
I have a 1D numpy numpy array with integers, where I want to replace zeros with the previous non-zero value if and only if the next non-zero value is the same.
例如,一个数组:
in: x = np.array([1,0,1,1,0,0,2,0,3,0,0,0,3,1,0,1])
out: [1,0,1,1,0,0,2,0,3,0,0,0,3,1,0,1]
应该成为
out: [1,1,1,1,0,0,2,0,3,3,3,3,3,1,1,1]
Is there a vectorized way to do this? I found some way to fill values of zeros here, but not how to do it with exceptions, i.e. to not fill the zeros that are within integers with different value.
推荐答案
以下是一种矢量化方法,灵感来自 NumPy based forward-filling
用于此解决方案中的前填充部分以及masking
和slicing
-
Here's a vectorized approach taking inspiration from NumPy based forward-filling
for the forward-filling part in this solution alongwith masking
and slicing
-
def forward_fill_ifsame(x):
# Get mask of non-zeros and then use it to forward-filled indices
mask = x!=0
idx = np.where(mask,np.arange(len(x)),0)
np.maximum.accumulate(idx,axis=0, out=idx)
# Now we need to work on the additional requirement of filling only
# if the previous and next ones being same
# Store a copy as we need to work and change input data
x1 = x.copy()
# Get non-zero elements
xm = x1[mask]
# Off the selected elements, we need to assign zeros to the previous places
# that don't have their correspnding next ones different
xm[:-1][xm[1:] != xm[:-1]] = 0
# Assign the valid ones to x1. Invalid ones become zero.
x1[mask] = xm
# Use idx for indexing to do the forward filling
out = x1[idx]
# For the invalid ones, keep the previous masked elements
out[mask] = x[mask]
return out
样品运行-
In [289]: x = np.array([1,0,1,1,0,0,2,0,3,0,0,0,3,1,0,1])
In [290]: np.vstack((x, forward_fill_ifsame(x)))
Out[290]:
array([[1, 0, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 3, 1, 0, 1],
[1, 1, 1, 1, 0, 0, 2, 0, 3, 3, 3, 3, 3, 1, 1, 1]])
In [291]: x = np.array([1,0,1,1,0,0,2,0,3,0,0,0,1,1,0,1])
In [292]: np.vstack((x, forward_fill_ifsame(x)))
Out[292]:
array([[1, 0, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 1, 1, 0, 1],
[1, 1, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 1, 1, 1, 1]])
In [293]: x = np.array([1,0,1,1,0,0,2,0,3,0,0,0,1,1,0,2])
In [294]: np.vstack((x, forward_fill_ifsame(x)))
Out[294]:
array([[1, 0, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 1, 1, 0, 2],
[1, 1, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 1, 1, 0, 2]])
这篇关于用相同的值在非零元素之间的numpy数组中填充零的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文