[Numpy-discussion] bug in object arrays:

Todd Miller jmiller at stsci.edu
Tue Jun 8 12:37:38 CDT 2004


On Sun, 2004-06-06 at 12:10, Peter Verveer wrote:
> Is this a bug?

I think this is more of a bonanza:  a bug and an ambiguity.

> This should result in an array of numpy arrays, but it does give an  
> error:
> 
>  >>> a = array([1,2])
>  >>> b = array([3,4])
>  >>> c = objects.array([a,b])
> Traceback (most recent call last):
>    File "<stdin>", line 1, in ?
>    File  
> "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/ 
> python2.3/site-packages/numarray/objects.py", line 732, in array
>      return fromlist(sequence, shape)
>    File  
> "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/ 
> python2.3/site-packages/numarray/objects.py", line 755, in fromlist
>      return ObjectArray(objects=l, shape=shape)
>    File  
> "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/ 
> python2.3/site-packages/numarray/objects.py", line 506, in __init__
>      oshape = _shapeFromNestedSequence(objects)
>    File  
> "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/ 
> python2.3/site-packages/numarray/objects.py", line 289, in  
> _shapeFromNestedSequence
>      return [len(s)] + _shapeFromNestedSequence(s[0])
> TypeError: can only concatenate list (not "tuple") to list

The bug is that your example didn't work as follows:

>>> import numarray.objects as obj
>>> obj.array([a,b])
ObjectArray([[1, 2],
             [3, 4]])

Returning a shape=(2,) object array is another obvious behavior but
turns out not to be what Numeric does and hence not what numarray does
either.   Faced with sequence objects,  Numeric and numarray both just
keep recursing (logically anyway) until they hit something which isn't a
sequence.  Thus, they return not a 1D array of arrays, but a 2D array of
numbers:

>>> import Numeric
Numeric.array([a,b], typecode='O')
array([[1 , 2 ],
       [3 , 4 ]],'O')

With some new code I added today,  numarray of the future will support
your preferred behavior like this, barring further discussion:

>>> obj.array([a,b], rank=1)
ObjectArray([array([1, 2]), array([3, 4])])

Here, the new "rank" parameter explicitly specifies the expected rank of
the resulting array, defining the point at which nested sequences become
"objects in their own right".  Perry's inclination was that rank should
default to 1 so that your expected behavior was the default.  Since
that's not backward compatible with Numeric (or numarray-0.9) I think
maybe rank=None is better.  In this case, rank=None is equivalent to
rank=2.

How does the rank parameter sound?

Regards,
Todd






More information about the Numpy-discussion mailing list