[SciPy-User] loadtxt and complicated dtype
Giovanni Luca Ciampaglia
ciampagg at usi.ch
Tue Aug 16 13:26:47 EDT 2011
Il 16. 08. 11 08:50, Gerrit Holl ha scritto:
> In my real case I
> have a 2-D array M with shape (5000, 839). I have my complicated
> dtype:
>
> [('temp',<type 'numpy.float64'>, 91),
> ('hum',<type 'numpy.float64'>, 91),
> ...,
> ('gpoint',<type 'numpy.uint32'>, 1),
> ('ind',<type 'numpy.uint16'>, 1)]
> ]
>
> whose numbers add up to 839. How do I turn this into an array of size
> (5000,) with my requested dtype?
> - .view(dtype) does not do what I mean, because this interprets the
> actual bytes, and my new array will have a different number of bytes
> compared to the old one
> - array(M, dtype) does not do what I mean, because this will try to
> expand every element of M according to the requested dtype, does
> making the array much larger (and throwing a MemoryError).
>
> I want this, because it's a very convenient way to access fields of my
> data. It's more convenient to say M["ciw"] than to say M[:, 455:546].
> If someone can suggest another way to achieve this convenience, I'm
> open for suggestions.
Hi Gerrit,
you could use numpy.empty:
# x has shape (5000, 184)
ty = dtype([('temp', float64, 91),
('hum', float64, 91),
('gpoint', int32, 1),
('ind', int16, 1)])
data = empty((5000,), ty)
# copy the individual columns
data['temp'] = x[:,:91]
data['hum'] = x[:,91:182]
data['gpoint'] = x[:,182]
data['ind'] = x[:,183]
you can probably do the assignments in a for loop using the shape
information from the individual fields
cheers
--
Giovanni Luca Ciampaglia
Ph.D. Candidate
Faculty of Informatics
University of Lugano
Web: http://www.inf.usi.ch/phd/ciampaglia/
Bertastraße 36 ∙ 8003 Zürich ∙ Switzerland
More information about the SciPy-User
mailing list