[NumPy-Tickets] [NumPy] #1441: rollaxis() has confusing error messages and should maybe interpret negative start argument differently

NumPy Trac numpy-tickets@scipy....
Wed Mar 31 17:38:14 CDT 2010

#1441: rollaxis() has confusing error messages and should maybe interpret negative
start argument differently
 Reporter:  kbasye      |       Owner:  somebody
     Type:  defect      |      Status:  new     
 Priority:  normal      |   Milestone:          
Component:  numpy.core  |     Version:          
 Keywords:              |  
 The rollaxis() function in numeric.py allows negative arguments for both
 the axis and the start.  For the axis, the usual Python interpretation of
 a negative value applies; the axis is chosen by counting from the back.
 For the start, however, -1 is not the last possible position, but the
 second to last.  I understand that fixing this is a change in the
 function's behavior, but at least the existing behavior is undocumented

 In both cases, the error messages can be confusing if too-negative values
 are given because the error raised uses modified values of the arguments
 and suggests a legal range that's smaller than what the function can
 actually handle.

 Since it's short and I've changed many lines, I'm just going to paste a
 suggested replacement here rather than a diff - hope that's OK.
 def rollaxis(a, axis, start=0):
     Roll the specified axis until it lies in a given position.

     a : ndarray
         Input array.
     axis : int
         The axis to roll.  The positions of the other axes do not
         change relative to one another.
     start : int, optional
         The axis is rolled until it lies before this position.

     res : ndarray
         Output array.

     See Also
     roll : Roll the elements of an array by a number of positions along a
            given axis.

     >>> a = np.ones((3,4,5,6))
     >>> rollaxis(a, 3, 1).shape
     (3, 6, 4, 5)
     >>> rollaxis(a, 2).shape
     (5, 3, 4, 6)
     >>> rollaxis(a, 1, 4).shape
     (3, 5, 6, 4)

     First axis becomes the last:

     >>> rollaxis(a, 0, -1).shape
     (4, 5, 6, 3)

     Last axis becomes the first:

     >>> rollaxis(a, -1).shape
     (6, 3, 4, 5)

     n = a.ndim
     orig_axis, orig_start = axis, start
     if axis < 0:
         axis += n
     if start < 0:
         start += n+1
     msg = 'rollaxis: %s (%d) must be >= %d and < %d'
     if not (0 <= axis < n):
         raise ValueError, msg % ('axis', orig_axis, -n, n)
     if not (0 <= start < n+1):
         raise ValueError, msg % ('start', orig_start, -n-1, n+1)
     if (axis < start): # removing axis below will shift the start position
         start -= 1
     if axis == start:
         return a
     axes = range(0,n)
     axes.insert(start, axis)
     return a.transpose(axes)


Ticket URL: <http://projects.scipy.org/numpy/ticket/1441>
NumPy <http://projects.scipy.org/numpy>
My example project

More information about the NumPy-Tickets mailing list