[Numpy-discussion] dtype confusion
Stefan van der Walt
stefan@sun.ac...
Sun Mar 25 07:25:11 CDT 2007
On Sun, Mar 25, 2007 at 04:09:11AM -0700, Jan Strube wrote:
> There seems to be a fundamental lack of understanding on my behalf when it
> comes to dtypes and record arrays.
> Please consider the following snippet:
>
> import numpy as N
> newtype = N.dtype([('x', N.float64 ), ('y', N.float64), ('z', N.float64)])
> a = N.random.random((100,3))
> a.dtype=newtype
> b = N.column_stack([a['x'].ravel(), a['y'].ravel(), a['z'].ravel()])
> b.dtype = newtype
> --> ValueError: new type not compatible with array.
>
> I don't understand two things about this:
> i) the shape of a changes from (100,3) to (100,1) after assigning
> the dtype.
Every group of three floats now become one element in the new array,
i.e.
float64 -> (float64,float64,float64)
> ii) the shape of b is obviously (100,3), so why can't I assign the
> new dtype?
The array is no longer a contiguous block of memory, so the new dtype
can't be applied:
In [23]: b.flags
Out[23]:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
The following does a copy of the array to contiguous memory:
In [24]: N.ascontiguousarray(b).dtype = newtype
If you want to move back to the original view you can do
b.view(N.float64)
Regards
Stéfan
More information about the Numpy-discussion
mailing list