2

给定一个数组

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

4

1 回答 1

1

您可以创建数据的窗口视图,即(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]不触发副本的情况下访问行。

于 2013-03-20T16:05:26.420 回答