how to efficiently select multiple slices from an array?

大兔子大兔子 提交于 2019-12-24 05:28:11

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!