chron0x
chron0x

Reputation: 995

Multidimensional Slicing

I want to slice out parts of my array foo multiple times. Currently I am using a for loop which I want to substitute through matrix computation to get a better performance in terms of speed.

foo = np.arange(6000).reshape(6,10,10,10)
target = np.zeros((100,6,3,4,5))
startIndices = np.random.randint(5, size=(100))

This is my current approach.

for i in range(len(target)):
    startIdx=startIndices[i]
    target[i, :]=foo[:, startIdx:startIdx+3,
                        startIdx:startIdx+4,
                        startIdx:startIdx+5]

I tried to represent the slices as arrays, but I couldn't find the proper representation.

Upvotes: 1

Views: 114

Answers (1)

Divakar
Divakar

Reputation: 221514

We can leverage np.lib.stride_tricks.as_strided based scikit-image's view_as_windows for efficient patch extraction, like so -

from skimage.util.shape import view_as_windows

# Get sliding windows (these are simply views)
WSZ = (1,3,4,5) # window sizes along the axes
w = view_as_windows(foo,WSZ)[...,0,:,:,:]

# Index with startIndices along the appropriate axes for desired output
out = w[:,startIndices, startIndices, startIndices].swapaxes(0,1)

Related :

NumPy Fancy Indexing - Crop different ROIs from different channels

Take N first values from every row in NumPy matrix that fulfill condition

Selecting Random Windows from Multidimensional Numpy Array Rows

how can I extract multiple random sub-sequences from a numpy array

Upvotes: 3

Related Questions