[Numpy-discussion] Finding many ways to incorrectly create a numpy array. Please advice

Derek Homeier derek@astro.physik.uni-goettingen...
Tue Aug 2 13:19:31 CDT 2011


On 2 Aug 2011, at 19:15, Christopher Barker wrote:

> In [32]: s = numpy.array(a, dtype=tfc_dtype)
> ---------------------------------------------------------------------------
> TypeError                                 Traceback (most recent  
> call last)
>
> /Users/cbarker/<ipython console> in <module>()
>
> TypeError: expected a readable buffer object
>
> OK -- I can see why you'd expect that to work. However, the trick with
> structured dtypes is that the dimensionality of the inputs can be less
> than obvious -- you are passing in a 1-d list of 4 numbers -- do you
> want a 1-d array? or ? -- in this case, it's pretty obvious (as a  
> human)
> what you would want -- you have a dtype with four fields, and you're
> passing in four numbers, but there are so many possible combinations
> that numpy doesn't try to be "smart" about it. So as a rule, you  
> need to
> be quite specific when working with structured dtypes.
>
> However, the default is for numpy to map tuples to dtypes, so if you
> pass in a tuple instead, it works:
>
> In [34]: t = tuple(a)
>
> In [35]: s = numpy.array(t, dtype=tfc_dtype)
>
> In [36]: s
> Out[36]:
> array((32000L, 0.789131, 0.00805999, 3882.22),
>       dtype=[('nps', '>u8'), ('t', '>f8'), ('e', '>f8'), ('fom',  
> '>f8')])
>
> you were THIS close!

Thanks for the detailed discussion! BTW this works also without  
explicitly converting the words one by one:

In [1]:  l = '      32000  7.89131E-01  8.05999E-03  3.88222E+03'
In [2]: tfc_dtype = numpy.dtype([('nps', 'u8'), ('t', 'f8'), ('e',  
'f8'),('fom', 'f8')])
In [3]: numpy.array(tuple(l.split()), dtype=tfc_dtype)
Out[3]:
array((32000L, 0.789131, 0.00805999, 3882.22),
       dtype=[('nps', '<u8'), ('t', '<f8'), ('e', '<f8'), ('fom',  
'<f8')])

Cheers,
						Derek



More information about the NumPy-Discussion mailing list