如何从IDL访问此'rec.array'中的数据?
我读了一个用IDL保存的*.sav文件,使用的是'readsav'这个函数(来自scipy.io.idl模块)。这个原始的*.sav文件是一个结构体,大小为170MB。
from scipy.io.idl import readsav
sorce = readsav('sorce.sav')
In [60]: sorce
Out[60]:
{'sorce': rec.array([ (20030225.5, 2452696.0, 0.0, 1.0, 57, 10, 7.812899639247917e-06, 0.07400000095367432, 0.527999997138977),
(20030225.5, 2452696.0, 1.0, 2.0, 57, 10, 0.00011726999946404248, 0.07400000095367432, 0.527999997138977),
(20030225.5, 2452696.0, 2.0, 3.0, 57, 10, 4.074300159118138e-05, 0.07400000095367432, 0.527999997138977),
...,
(20110511.5, 2455693.0, 37.0, 38.0, 57, 10, 8.608300049672835e-06, 0.02227799966931343, 0.19189999997615814),
(20110511.5, 2455693.0, 38.0, 39.0, 57, 10, 7.07949993739021e-06, 0.02227799966931343, 0.19189999997615814),
(20110511.5, 2455693.0, 39.0, 40.0, 57, 10, 5.316100214258768e-06, 0.02227799966931343, 0.19189999997615814)],
dtype=[(('nominal_date_yyyymmdd', 'NOMINAL_DATE_YYYYMMDD'), '>f8'), (('nominal_date_jdn', 'NOMINAL_DATE_JDN'), '>f8'), (('min_wavelength', 'MIN_WAVELENGTH'), '>f4'), (('max_wavelength', 'MAX_WAVELENGTH'), '>f4'), (('instrument_mode_id', 'INSTRUMENT_MODE_ID'), '>i2'), (('data_version', 'DATA_VERSION'), '>i2'), (('irradiance', 'IRRADIANCE'), '>f4'), (('irradiance_uncertainty', 'IRRADIANCE_UNCERTAINTY'), '>f4'), (('quality', 'QUALITY'), '>f4')])}
我该怎么访问里面的'sorce'数据呢?
我在这里找到了一些描述 http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html
但是示例中的'dtype'看起来是这样的:
dtype=[('x', '<i4'), ...]
而在我的情况下是这样的:
dtype=[('x', 'X', '<i4'), ...]
我无法通过以下方式访问数据:
sorce.x (x -> 'nominal_date_yyyymmdd', etc)
或者
sorce.X
我搜索了一段时间,但还是搞不明白。
1 个回答
3
你的 sorce
变量实际上是指向一个 dict
(字典),而不是 recarray
(记录数组)。根据上面的例子,你应该使用:
from scipy.io.idl import readsav
sorce = readsav('sorce.sav')
sorce_rec = sorce["sorce"]
现在你可以像使用普通的 recarray
一样访问你的数据了。
另外,你提到你的数据类型是:
dtype=[('x', 'X', '<i4'), ...]
但实际上是:
dtype=[(('x', 'X'), '<i4'), ...]
在第二种情况下,'x' 和 'X' 是同义词,你可以用这两种方式来访问 'x'
列的数据(也就是说 sorce_rec['x'] == sorce_rec['X']
是成立的)。