[Numpy-discussion] Structured array inititialization weirdness

Stéfan van der Walt stefan at sun.ac.za
Sat Jun 20 13:35:16 EDT 2009

Hi Erik

2009/6/20 Erik Tollerud <erik.tollerud at gmail.com>:
> I've encountered an odd error I don't understand (see the case below):
> the first structured array ("A" in the example) initializes from a
> list of length-2 arrays with no problem, but if I give it a 2-by-2
> array ("B"), it raises a TypeError... Why would it be any different to
> convert the first index of the array into a list?
>>>> from numpy import *
>>>> from numpy.random import *
>>>> dt=dtype([('a','f'),('b','f')])
>>>> A=array(list(randn(2,10)),dtype=dt)
>>>> B=array(randn(2,10),dtype=dt)
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> TypeError: expected a readable buffer object

The ndarray constructor does its best to guess what kind of data you
are feeding it, but sometimes it needs a bit of help.  By casting your
array to list, you give numpy a hint as to how your data is
partitioned.  In this case, however, I think that hint is the wrong

I prefer to construct arrays explicitly, so there is no doubt what is
happening under the hood:

dt = np.dtype([('a', np.float64), ('b', np.float64)])

Alternatively, construct the array first, and then fill the elements:

x = np.zeros(10, dtype=dt)
x['a'] = np.random.random(10)
x['b'] = np.random.random(10)


More information about the NumPy-Discussion mailing list