[Numpy-discussion] reshape and ravel methods of arrays now return views or raise error

Zachary Pincus zpincus at stanford.edu
Tue Mar 28 17:36:11 CST 2006

Uh oh,

Just updated to new numpy so that dot() wouldn't be broken. What fun  
to play with the new order/ravel/reshape stuff.

Unfortunately, the ravel/reshape methods seem to not be quite worked  
out properly yet. Basically (and as expected) the ravel method  
doesn't work anymore on fortran-strided arrays. But since fortran- 
strided arrays happen *all-the-time* (e.g. after a transpose  
operation), things get confusing fast.

In fact, absolutely no reshape operation (other than the identity  
reshape) will work on fortran-strided arrays (see below). Also, the  
errors could be more helpful, and anyway ravel shouldn't fail with an  
error about reshape fortran-strided.

This can't be the optimal situation, since it makes the method  
interface next-to-useless (because exceptions might be thrown at any  
moment) unless a *lot* of care is taken to properly sanitize the  
arrays that are used (in which case any speed gains are probably lost).

In [1]: import numpy
In [2]: numpy.__version__
Out[2]: ''
In [3]: a = numpy.array([[1,2],[3,4],[5,6]])
In [4]: b = a.transpose()
In [5]: a.ravel()
Out[5]: array([1, 2, 3, 4, 5, 6])
In [6]: b.ravel()
ValueError: cannot return a view from reshape.
In [7]: b.shape
Out[7]: (2, 3)
In [8]: b.reshape((1,6))
ValueError: cannot return a view from reshape.
In [9]: b.reshape((6,1))
ValueError: cannot return a view from reshape.
In [10]: b.reshape((3,2))
ValueError: cannot return a view from reshape.

This state of affairs seems pretty hostile to both advanced users and  
basic ones. Now I need to go through all of my code and eliminate the  
use of array methods, since about half of the time I'll be calling  
things like ravel on arrays that have been transposed. What a waste  
-- is there something better I can do or something better numpy can do?

At the very least, a strong convention really needs to be established  
and made clear about what the methods do (never return copies) and  
what the functions do (sometimes return copies? hardly a strong  
convention), and when to choose one or the other.


More information about the Numpy-discussion mailing list