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

时间:2013-03-20 15:22:10

标签: python numpy indexing

给定数组

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),所以快速的东西会很有用。

1 个答案:

答案 0 :(得分:1)

您可以创建数据的窗口视图,即(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] 1}}不触发副本。