Nice solution, Robert. My solution was not idiomatic Numpy, but it was idiomatic Python:
def slice2d(arr): xmax, ymax = arr.shape[-2:] return (arr[...,x,y] for x in range(xmax) for y in range(ymax)) On Tue, Aug 29, 2017 at 6:47 PM, Robert Kern <robert.k...@gmail.com> wrote: > 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 > > -- *John J. Ladasky Jr., Ph.D.* *Research Scientist* *International Technological University* *2711 N. First St, San Jose, CA 95134 USA*
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion