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

问题描述 投票:1回答:2

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

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

python numpy numpy-broadcasting
2个回答
2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.