在1D数组中以不规则的间隔分配序列-Python / NumPy

时间:2019-04-16 20:18:06

标签: python numpy numpy-broadcasting

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

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循环。如果有帮助,模式将始终是一个范围。

2 个答案:

答案 0 :(得分:3)

我们可以利用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windows来将滑动的窗口视图获取到输出数组中,从而为其分配新的值。这将非常有效,因为我们正在使用视图,因此不会生成显式索引,并且分配是矢量化并广播的。

实现看起来像这样-

from skimage.util.shape import view_as_windows

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

More info on use of as_strided based view_as_windows

答案 1 :(得分:2)

构造一个2D选择器数组,以选择要用dates修改的numpy.add.outer的索引,然后对选定的索引执行pattern的广播分配:

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