给定一个数组

d = np.random.randn(100)


和索引数组

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


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

r.shape = (20, 8)


这样对于所有j=0..19

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


在我的情况下,数组非常大(〜200000,而不是100和20),所以快速操作会很有用。

最佳答案

您可以创建数据的窗口视图,即(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只是原始数据的视图,因此不占用额外的内存。使用任意索引提取r时,将复制数据。因此,根据您想要使用r数组的方式,您可能希望尽可能地延迟,甚至完全避免使用它:您始终可以将r[j]行作为wd[j-3]访问,而无需触发复制。

关于python - 如何有效地从数组中选择多个切片?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15527666/

10-12 18:20
查看更多