2

Given a numpy array x of shape (N_1...N_k) where k is arbitrary, and 2 arrays :

start_indices=[a_1,...,a_k], end_indices=[b_1,...b_k], where `0<=a_i<b_i<=N_i`.

I want to slice x as follows: x[a_1:b_1,...,a_k:b_k].

Lets say :

x is of shape `(1000, 1000, 1000)`
start_indices=[450,0,400]
end_indices=[550,1000,600].

I want the output to be equal x[450:550,0:1000,400:600].

For example I tried to define :

slice_arrays = (np.arange(start_indices[i], end_indices[i]) for i in range(k))

and use

x[slice_arrays]

but it didn't work.

Divakar
  • 218,885
  • 19
  • 262
  • 358
Itaysason
  • 31
  • 2

1 Answers1

3

You can use slice notation to create an indexing tuple that could be used for the indexing -

indexer = tuple([slice(i,j) for (i,j) in zip(start_indices,end_indices)])
out = x[indexer]

Alternatively, with shorthand np.s_ -

indexer = tuple([np.s_[i:j] for (i,j) in zip(start_indices,end_indices)])

Or with map for a compact one -

indexer = tuple(map(slice,start_indices,end_indices))
Divakar
  • 218,885
  • 19
  • 262
  • 358