给定一个数组
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)
数组,其中 item[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]
不触发副本的情况下访问行。