给定数组
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),所以快速的东西会很有用。
答案 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}}不触发副本。