如何从IDL访问此'rec.array'中的数据?

3 投票
1 回答
1749 浏览
提问于 2025-04-18 05:26

我读了一个用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'] 是成立的)。

撰写回答