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-50:cpix+50, cpix-50:cpix+50] a2 = array2[cpix-50:cpix+50, cpix-50:cpix+50] a3 = array3[cpix-50:cpix+50, cpix-50:cpix+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?
Yes you can use
>>> a = np.arange(10).reshape(2, 5) >>> >>> m = np.s_[0:2, 3:4] >>> >>> a[m] array([, ])
And in this case:
my_slice = np.s_[cpix-50:cpix+50, cpix-50:cpix+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.
You can index a multidimensional array by using a tuple of
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))