给定一个数组
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] 而不会触发复制。
