[Numpy-discussion] View ND Homogeneous Record Array as (N+1)D Array?
Alexander Michael
lxander.m@gmail....
Tue Mar 18 07:45:55 CDT 2008
On Mon, Mar 17, 2008 at 4:55 PM, Robert Kern <robert.kern@gmail.com> wrote:
> On Mon, Mar 17, 2008 at 3:44 PM, Alexander Michael <lxander.m@gmail.com> wrote:
> > Is there a way to view an N-dimensional array with a *homogeneous*
> > record dtype as an array of N+1 dimensions? An example will make it
> > clear:
> >
> > import numpy
> > a = numpy.array([(1.0,2.0), (3.0,4.0)], dtype=[('A',float),('B',float)])
> > b = a.view(...) # do something magical
> > print b
> > array([[ 1., 2.],
> > [ 3., 4.]])
> > b[0,0] = 0.0
> > print a
> > [(0.0, 2.0) (3.0, 4.0)]
>
>
> Just use a.view(float) and then reshape as appropriate.
>
> In [1]: import numpy
>
> In [2]: a = numpy.array([(1.0,2.0), (3.0,4.0)], dtype=[('A',float),('B',float)])
>
> In [3]: a.view(float)
> Out[3]: array([ 1., 2., 3., 4.])
>
> In [4]: b = _
>
> In [5]: b.shape = a.shape + (-1,)
>
> In [6]: b
> Out[6]:
>
> array([[ 1., 2.],
> [ 3., 4.]])
>
> In [7]: b[0,0] = 0.0
>
> In [8]: a
> Out[8]:
> array([(0.0, 2.0), (3.0, 4.0)],
> dtype=[('A', '<f8'), ('B', '<f8')])
Cool. Thanks. I made a little function for doing this if anyone else
is interested:
import numpy
def unpacked_view(x):
"""Return a view of `x` with its fields unpacked. Requires all fields to
have the same type.
Examples
--------
>>> a = numpy.array(
... [(1.0,2.0), (3.0,4.0), (5.0,6.0)],
... dtype=[('A',float),('B',float)])
>>> u = unpacked_view(a)
>>> u
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]])
>>> u.shape
(3, 2)
"""
if x.dtype.names:
ftypes = set([t for n,t in x.dtype.descr])
assert(len(ftypes) == 1)
ftype = ftypes.pop()
y = x.view(ftype)
unpacked_shape = x.shape + (-1,)
y.shape = unpacked_shape
return y
else:
return x
More information about the Numpy-discussion
mailing list