我想知道是否有一种验证的方式来使用两个数组,并基于一个数组的值连续复制第二个数组中的值,直到找到第一个数组中的新值,然后重复整个过程。
这是一个例子
a = np.array([FALSE,TRUE,FALSE,FALSE, FALSE, TRUE, FALSE FALSE})
b = np.array([0,10,0,0,0,20,0,0,])
output = array([0,10,10,10,10,20,20,20])
为此,我可以使用一个太慢的循环。
for i in range(len(b)):
if b[i-1] and not b[i]:
b[i] = b[i-1]
已更新:
我在下面尝试了此代码,并将速度提高了5倍,但我认为应该有一种更快,更优雅的方法。
import numpy as np
nz= np.concatenate((np.nonzero(b)[0], [len(b)]))
np.repeat(b[np.nonzero(b)], np.diff(nz))
答案 0 :(得分:1)
您的示例可以稍作改进:
b = np.array([0, 10, 0, 0, 0, 20, 0, 0])
nz = np.squeeze(np.nonzero(b))
diffs = np.empty_like(nz)
diffs[:-1] = np.diff(nz)
diffs[-1] = b.size - nz[-1]
result = np.repeat(b[nz], diffs)
...虽然我不确定我是否了解该应用程序。
对代码进行性能检查并找出到底是什么导致了应用程序瓶颈的原因可能是明智的。您可能还希望说明阵列的大小。 (例如,itertools
解决方案对于较少的元素可能更快。)
答案 1 :(得分:0)
这可以推广到n维数组。 遍历数组的n-1d个切片。
In [26]: a=np.array([
...: [ 0, 0,10, 0, 0, 0,20,30, 0, 0],
...: [ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
...: [ 0, 5, 0, 6, 0, 7, 0, 8, 0, 9]])
In [27]: bfwd=0
...: for ix in range(a.shape[-1]):
...: sel=np.s_[... ,ix]
...: a[sel]=bfwd*(a[sel]==0)+a[sel] # If a is zero use bfwd else use a
...: bfwd=a[sel]
In [28]: a
Out[28]:
array([[ 0, 0, 10, 10, 10, 10, 20, 30, 30, 30],
[ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
[ 0, 5, 5, 6, 6, 7, 7, 8, 8, 9]])
HTH