[Numpy-discussion] dumb structured arrays question

Erin Sheldon erin.sheldon at gmail.com
Thu Sep 17 18:18:29 EDT 2009


On Thu, Sep 17, 2009 at 6:12 PM, David Warde-Farley <dwf at cs.toronto.edu> wrote:
> If I have a 1-dimensional array with a structured dtype, say str,
> float, float, float, float.... where all the float columns have their
> own names, and I just want to extract all the floats in the order they
> appear into a 2D matrix that disregards the dtype metadata... Is there
> an easy way to do that?
>
> Currently the only thing I can think of is
>
> out = []
> for name in arr.dtype.names:
>        if name != 'condition': # my single str field
>                out.append(arr['name'])
> out = np.array(out)
>
> Is there already some convenience function for this, to coerce numeric
> compound dtypes into an extra dimension?
>
> It seems conceivable that I might be able to pull some dirty trick
> with stride_tricks that would even allow me to avoid the copy, since
> it'd just be a matter of an extra few bytes on the 2nd dimension
> stride to skip over the string data.
>
> Thanks,
>
> David

You can just view it differently:

In [4]: x=numpy.zeros(3,dtype=[('field1','S5'),('field2','f4'),('field3','f4'),('field4','f4')])

In [5]: x
Out[5]:
array([('', 0.0, 0.0, 0.0), ('', 0.0, 0.0, 0.0), ('', 0.0, 0.0, 0.0)],
      dtype=[('field1', '|S5'), ('field2', '<f4'), ('field3', '<f4'),
('field4', '<f4')])

In [6]: dt=numpy.dtype([('field1','S5'),('compound','3f4')])

In [7]: x.view(dt)
Out[7]:
array([('', [0.0, 0.0, 0.0]), ('', [0.0, 0.0, 0.0]), ('', [0.0, 0.0, 0.0])],
      dtype=[('field1', '|S5'), ('compound', '<f4', 3)])

In [8]: x.view(dt)['compound']
Out[8]:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]], dtype=float32)

Hope this helps,
Erin Sheldon



More information about the NumPy-Discussion mailing list