<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 28, 2014 at 1:42 PM, Stephan Hoyer <span dir="ltr"><<a href="mailto:shoyer@gmail.com" target="_blank">shoyer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">.flat lets you iterate over all elements of a N-dimensional array as if it was 1D, without ever needing to make a copy of the array. In contrast, ravel() and reshape(-1) cannot always avoid a copy, because they need to return another ndarray.</blockquote></div><div class="gmail_extra"><br></div><span style="font-family:arial,sans-serif;font-size:12.5714282989502px">In some cases ravel() returns a copy where a view can be easily constructed.</span><span style="font-family:arial,sans-serif;font-size:12.5714282989502px">  For example,</span><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px"><br></div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px"><div class="gmail_extra">>>> x = np.arange(10)</div><div class="gmail_extra">>>> y = x[::2]</div><div class="gmail_extra"><div class="gmail_extra">>>> y.ravel().flags['OWNDATA']</div><div class="gmail_extra">True</div><div class="gmail_extra"><br></div><div class="gmail_extra">Interestingly, in the same case <span style="font-size:12.5714282989502px">reshape(-1) returns a view:</span></div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">>>> y.reshape(-1).flags['OWNDATA']</div><div class="gmail_extra">False</div></div><div class="gmail_extra"><br></div><div class="gmail_extra">(This suggests at least a documentation bug - numpy.ravel documentation says that it is equivalent to reshape(-1).)</div><div class="gmail_extra"><br></div><div class="gmail_extra">It is only in situations like this</div><div class="gmail_extra"><br></div></div></div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px"><div class="gmail_extra" style="font-size:12.5714282989502px">>>> a = np.arange(16).reshape((4,4))</div><div class="gmail_extra" style="font-size:12.5714282989502px">>>> a[1::2,1::2].ravel()</div><div class="gmail_extra" style="font-size:12.5714282989502px">array([ 5,  7, 13, 15])</div><div class="gmail_extra" style="font-size:12.5714282989502px"><br></div><div class="gmail_extra" style="font-size:12.5714282989502px">where flat view cannot be an ndarray, but .flat can still return something that is at least duck-typing compatible with ndarray (if not an ndarray subclass) and behaves as a view into original data.</div></div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px"><br></div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">My preferred design would be for x.flat to return a flat view into x.  This would be consistent with the way .T and .real attributes are defined and close enough to .imag.  An obvious way to obtain a flat copy would be x.flat.copy().  Once we have this, ravel() and flatten() can be deprecated and reshape(-1) discouraged.</div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px"><br></div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">I think this would be backward compatible except for rather questionable situations like this:</div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px"><br></div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">>>> i = x.flat</div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">>>> list(i)</div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">[0, 1, 2, 3, 4, 0, 6, 7, 8, 9]</div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">>>> list(i)</div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">[]</div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">>>> np.array(i)</div><div class="gmail_extra" style="font-family:arial,sans-serif;font-size:12.5714282989502px">array([0, 1, 2, 3, 4, 0, 6, 7, 8, 9])  </div></div></div>