30

I've tried to find a neat solution to this, but I'm slicing several 2D arrays of the same shape in the same manner. I've tidied it up as much as I can by defining a list containing the 'x,y' center e.g. cpix = [161, 134] What I'd like to do is instead of having to write out the slice three times like so:

a1 = array1[cpix[1]-50:cpix[1]+50, cpix[0]-50:cpix[0]+50] 
a2 = array2[cpix[1]-50:cpix[1]+50, cpix[0]-50:cpix[0]+50] 
a3 = array3[cpix[1]-50:cpix[1]+50, cpix[0]-50:cpix[0]+50]

is just have something predefined (like maybe a mask?) so I can just do a

a1 = array1[predefined_2dslice] 
a2 = array2[predefined_2dslice] 
a3 = array3[predefined_2dslice] 

Is this something that numpy supports?

Mazdak
  • 105,000
  • 18
  • 159
  • 188
FriskyGrub
  • 979
  • 3
  • 14
  • 25
  • 1
    `np.s_` produces a tuple of slice objects: `(slice(cpix[1]-50:cpix[1]+50), slice(cpix[0]-50:cpix[0]+50))` – hpaulj Aug 12 '16 at 17:47

2 Answers2

47

Yes you can use numpy.s_:

Example:

>>> a = np.arange(10).reshape(2, 5)
>>> 
>>> m = np.s_[0:2, 3:4]
>>> 
>>> a[m]
array([[3],
       [8]])

And in this case:

my_slice = np.s_[cpix[1]-50:cpix[1]+50, cpix[0]-50:cpix[0]+50]

a1 = array1[my_slice] 
a2 = array2[my_slice] 
a3 = array3[my_slice]

You can also use numpy.r_ in order to translates slice objects to concatenation along the first axis.

Mazdak
  • 105,000
  • 18
  • 159
  • 188
15

You can index a multidimensional array by using a tuple of slice objects.

window = slice(col_start, col_stop), slice(row_start, row_stop)
a1 = array1[window]
a2 = array2[window] 

This is not specific to numpy and is simply how subscription/slicing syntax works in python.

class mock_array:
    def __getitem__(self, key):
        print(key)
m = mock_array()
m[1:3, 7:9] # prints tuple(slice(1, 3, None), slice(7, 9, None))
benjimin
  • 4,043
  • 29
  • 48
  • 1
    This answer is more elegant than the accepted one IMO. – András Aszódi Oct 20 '20 at 16:07
  • 1
    numpy.s_ returns slice objects anyway. For 1-D slices the latter command might be more readable, but for higher dimensions I definitely prefer the former. – Quant Metropolis Jan 29 '21 at 16:05
  • 1
    The definition of mock_array is really really close to what's behind np.s_ or np.index_exp, see the [source code of np.IndexExpression](https://github.com/numpy/numpy/blob/c65bc212ec1987caefba0ea7efe6a55803318de9/numpy/lib/index_tricks.py#L758) – Demi-Lune Feb 01 '22 at 13:29
  • Order should be (row, column) instead of (column, row) – alercelik Apr 03 '22 at 11:13