问题
Given an array
d = np.random.randn(100)
and an index array
i = np.random.random_integers(low=3, high=d.size - 5, size=20)
how can I efficiently create a 2d array r with
r.shape = (20, 8)
such that for all j=0..19,
r[j] = d[i[j]-3:i[j]+5]
In my case, the arrays are quite large (~200000 instead of 100 and 20), so something quick would be useful.
回答1:
You can create a windowed view of your data, i.e. a (93, 8) array, where item [i, j] is item [i+j] of your original array, as:
>>> from numpy.lib.stride_tricks import as_strided
>>> wd = as_strided(d, shape=(len(d)-8+1, 8), strides=d.strides*2)
You can now extract your desired slices as:
>>> r = wd[i-3]
Note that wd is simply a view of your original data, so it takes no extra memory. The moment you extract r with arbitrary indices, the data is copied. So depending on how you want to use your r array, you may want to delay that as much as possible, or maybe even avoid it altogether: you can always access what would be row r[j] as wd[j-3] without triggering a copy.
来源:https://stackoverflow.com/questions/15527666/how-to-efficiently-select-multiple-slices-from-an-array