在一维数组中以不规则的间隔分配一个序列 - Python / NumPy

Assign a sequence at irregular intervals in 1D array - Python / NumPy

我有一个数字序列,我想以不规则的间隔插入到一个更大的数组中:

dates = np.zeros(15)
pattern = np.arange(3) + 1
starts = [2, 6, 11]
for start in starts:
    dates[start:start + pattern.size] = pattern

> [0 0 1 2 3 0 1 2 3 0 0 1 2 3 0]

我必须在大型 (10K+) 数组上执行这么多 (100M+) 次,因此我正在寻找一种通过广播或其他有效方法来执行此操作的方法,从而避免 for 循环。如果有帮助,模式 将始终是一个范围。

构造一个二维 select 或数组 select 要用 numpy.add.outer 修改的 dates 的索引,然后执行 [=13= 的广播赋值] 进入 selected 索引:

dates[numpy.add.outer(starts, numpy.arange(len(pattern)))] = pattern

我们可以利用 np.lib.stride_tricks.as_strided based scikit-image's view_as_windows 将滑动窗口视图获取到输出数组中,然后将新值分配给它。这将非常有效,因为我们正在处理视图,没有生成显式索引并且分配是矢量化和广播的。

实现看起来像这样 -

from skimage.util.shape import view_as_windows

view_as_windows(dates,pattern.size)[starts] = pattern

.