[Numpy-discussion] Behavior from a change in dtype?

Skipper Seabold jsseabold@gmail....
Mon Sep 7 19:01:18 CDT 2009

On Mon, Sep 7, 2009 at 7:35 PM, <josef.pktd@gmail.com> wrote:
> On Mon, Sep 7, 2009 at 6:36 PM, Skipper Seabold<jsseabold@gmail.com> wrote:
>> Hello all,
>> I ran into a problem with some of my older code (since figured out the
>> user error).  However, in trying to give a simple example that
>> replicates the problem I was having, I ran into this.
>> In [19]: a = np.array((1.))
>> In [20]: a
>> Out[20]: array(1.0)
>> # the dtype is 'float64'
>> In [21]: a.dtype='<i8'
> The way I understand it is:
> Here you are telling numpy to interpret the existing memory/data in a
> different way, which might make sense or not depending on the types,
> e.g. I also used this to switch between structured arrays and regular
> arrays with compatible memory. However it does not convert the data.
> If you want to convert the data to a different type, numpy needs to
> create a new array, e.g. with astype
>>>> a = np.array((1.))
>>>> b = a.astype('<i8')
>>>> b
> array(1L, dtype=int64)
> Josef

Hmm, okay, well I came across this in trying to create a recarray like
data2 below, so I guess I should just combine the two questions.  Is
the last example the best way to do what I'm trying to do (taken from
an old thread)?  I would like to add a few more examples of best
practice here <http://docs.scipy.org/doc/numpy/user/basics.rec.html>,
so I don't need to go looking again.

import numpy as np

data = np.array([[10.75, 1, 1],[10.39, 0, 1],[18.18, 0, 1]])
dt = np.dtype([('var1', '<f8'), ('var2', '<i8'), ('var3', '<i8')])
data2 = data.copy()
data3 = data.copy()

# Doesn't work, raises TypeError: expected a readable buffer object
data2 = data2.view(np.recarray)

# Works without error (?) with unexpected result
data3 = data3.view(np.recarray)
data3.dtype = dt

# One correct (though IMHO) unintuitive way
data = np.rec.fromarrays(data.swapaxes(1,0), dtype=dt)


More information about the NumPy-Discussion mailing list