Skip to main content
 首页 » 编程设计

python之如何有效地从数组中选择多个切片

2025年05月04日9jirigala

给定一个数组

d = np.random.randn(100) 

和一个索引数组

i = np.random.random_integers(low=3, high=d.size - 5, size=20) 

我如何高效地创建一个二维数组 r with

r.shape = (20, 8) 

对于所有 j=0..19,

r[j] = d[i[j]-3:i[j]+5] 

在我的例子中,数组非常大(~200000 而不是 100 和 20),所以快速处理会很有用。

请您参考如下方法:

您可以创建数据的窗口 View ,即 (93, 8) 数组,其中项目 [i, j] 是项目 [i +j] 您的原始数组,如:

>>> from numpy.lib.stride_tricks import as_strided 
>>> wd = as_strided(d, shape=(len(d)-8+1, 8), strides=d.strides*2) 

您现在可以将所需的切片提取为:

>>> r = wd[i-3] 

请注意,wd 只是您原始数据的一个 View ,因此它不需要额外的内存。当您使用任意索引提取 r 时,数据将被复制。所以根据你想如何使用你的 r 数组,你可能想尽可能地延迟它,或者甚至可能完全避免它:你总是可以访问行 r[ j] 作为 wd[j-3] 而不会触发复制。