32

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?

1
  • 1
    np.s_ produces a tuple of slice objects: (slice(cpix[1]-50:cpix[1]+50), slice(cpix[0]-50:cpix[0]+50)) Commented Aug 12, 2016 at 17:47

2 Answers 2

50

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.

Sign up to request clarification or add additional context in comments.

4 Comments

This is exactly what I was looking for. I love when learning neat new tricks like this :) Thanks
@FriskyGrub If you want to learn more about such tricks, I suggest you to delve into the documentation ;-)
And look at the value produced by np.s_. It's just a tuple.
Why give these useful utility functions such cryptic names, esp the underscore that suggests something internal? History?
21

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))

4 Comments

This answer is more elegant than the accepted one IMO.
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.
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
Order should be (row, column) instead of (column, row)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.