On Tue, Aug 29, 2017 at 6:03 PM, Moroney, Catherine M (398E) < catherine.m.moro...@jpl.nasa.gov> wrote:
> Hello, > > > > I have an n-dimensional array (say (4,4,2,2)) and I wish to automatically > extract all the (4,4) slices in it. > > i.e. > > > > a = numpy.arange(0, 64).reshape(4,4,2,2) > > slice1 = a[..., 0, 0] > > slice2 = a[..., 0, 1] > > slice3 = a[..., 1, 0] > > slice4 = a[..., 1,1] > > > > Simple enough example but in my case array “a” will have unknown rank and > size. All I know is that it will have more than 2 dimensions, but I don’t > know ahead of time how many dimensions or what the size of those dimensions > are. > > > > What is the best way of tackling this problem without writing a whole > bunch of if-then cases depending on what the rank and shape of a is? Is > there a one-size-fits-all solution? > First, reshape the array to (4, 4, -1). The -1 tells the method to choose whatever's needed to get the size to work out. Then roll the last axis to the front, and then you have a sequence of the (4, 4) arrays that you wanted. E.g. (using (4,4,3,3) as the original shape for clarity) [~] |26> a = numpy.arange(0, 4*4*3*3).reshape(4,4,3,3) [~] |27> b = a.reshape([4, 4, -1]) [~] |28> b.shape (4, 4, 9) [~] |29> c = np.rollaxis(b, -1, 0) [~] |30> c.shape (9, 4, 4) [~] |31> c[0] array([[ 0, 9, 18, 27], [ 36, 45, 54, 63], [ 72, 81, 90, 99], [108, 117, 126, 135]]) [~] |32> c[1] array([[ 1, 10, 19, 28], [ 37, 46, 55, 64], [ 73, 82, 91, 100], [109, 118, 127, 136]]) -- Robert Kern
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion