Skip to content Skip to sidebar Skip to footer

How To Efficiently Select Multiple Slices From An Array?

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 =

Solution 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.

Post a Comment for "How To Efficiently Select Multiple Slices From An Array?"