给定一个数组
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/