<div dir="ltr">Nice solution, Robert.<div><br></div><div>My solution was not idiomatic Numpy, but it was idiomatic Python:</div><div><br></div><div><div>def slice2d(arr):</div><div>    xmax, ymax = arr.shape[-2:]</div><div>    return (arr[...,x,y] for x in range(xmax) for y in range(ymax))</div></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 29, 2017 at 6:47 PM, Robert Kern <span dir="ltr"><<a href="mailto:robert.kern@gmail.com" target="_blank">robert.kern@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="">On Tue, Aug 29, 2017 at 6:03 PM, Moroney, Catherine M (398E) <span dir="ltr"><<a href="mailto:Catherine.M.Moroney@jpl.nasa.gov" target="_blank">Catherine.M.Moroney@jpl.nasa.<wbr>gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">







<div bgcolor="white" lang="EN-US">
<div class="m_-6822338270709741238gmail-m_-7086056345606375623WordSection1">
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">Hello,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">I have an n-dimensional array (say (4,4,2,2)) and I wish to automatically extract all the (4,4) slices in it.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">i.e.
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">a = numpy.arange(0, 64).reshape(4,4,2,2)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">slice1 = a[..., 0, 0]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">slice2 = a[..., 0, 1]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">slice3 = a[..., 1, 0]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">slice4 = a[..., 1,1]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">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.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:Helvetica,sans-serif">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?</span></p></div></div></blockquote><div><br></div></span>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.</div><div class="gmail_quote"><br></div><div class="gmail_quote">E.g. (using (4,4,3,3) as the original shape for clarity)</div><div class="gmail_quote"><br><font face="monospace, monospace"><div class="gmail_quote">[~]</div><div class="gmail_quote">|26> a = numpy.arange(0, 4*4*3*3).reshape(4,4,3,3)</div><div class="gmail_quote"><br></div><div class="gmail_quote">[~]</div><div class="gmail_quote">|27> b = a.reshape([4, 4, -1])</div><div class="gmail_quote"><br></div><div class="gmail_quote">[~]</div><div class="gmail_quote">|28> b.shape</div><div class="gmail_quote">(4, 4, 9)</div><div class="gmail_quote"><br></div><div class="gmail_quote">[~]</div><div class="gmail_quote">|29> c = np.rollaxis(b, -1, 0)</div><div class="gmail_quote"><br></div><div class="gmail_quote">[~]</div><div class="gmail_quote">|30> c.shape</div><div class="gmail_quote">(9, 4, 4)</div><div class="gmail_quote"><br></div><div class="gmail_quote">[~]</div><div class="gmail_quote">|31> c[0]</div><div class="gmail_quote">array([[  0,   9,  18,  27],</div><div class="gmail_quote">       [ 36,  45,  54,  63],</div><div class="gmail_quote">       [ 72,  81,  90,  99],</div><div class="gmail_quote">       [108, 117, 126, 135]])</div><div class="gmail_quote"><br></div><div class="gmail_quote">[~]</div><div class="gmail_quote">|32> c[1]</div><div class="gmail_quote">array([[  1,  10,  19,  28],</div><div class="gmail_quote">       [ 37,  46,  55,  64],</div><div class="gmail_quote">       [ 73,  82,  91, 100],</div><div class="gmail_quote">       [109, 118, 127, 136]])</div><span class="HOEnZb"><font color="#888888"><div class="gmail_quote"><br></div></font></span></font></div><span class="HOEnZb"><font color="#888888">-- <br><div class="m_-6822338270709741238gmail_signature">Robert Kern</div>
</font></span></div></div>
<br>______________________________<wbr>_________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/numpy-<wbr>discussion</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><b>John J. Ladasky Jr., Ph.D.</b><div><b>Research Scientist</b></div><div><b>International Technological University</b></div><div><b>2711 N. First St, San Jose, CA 95134 USA</b></div></div></div>
</div>