【发布时间】:2016-03-24 02:46:31
【问题描述】:
在previous posts 中,我看到可以使用astype 更改recarray 的dtype。但是,我无法使用 recarray 来做到这一点,它的一列中有一个数组。
我的recarray 来自一条 FITS 文件记录:
> f = fits.open('myfile.fits')
> tbdata = f[1].data
> tbdata
# FITS_rec([ (0.27591679999999996, array([570, 576, 566, ..., 571, 571, 569], dtype=int16)),
# (0.55175680000000005, array([575, 563, 565, ..., 572, 577, 582], dtype=int16)),
# ...,
# (2999.2083967999997, array([574, 570, 575, ..., 560, 551, 555], dtype=int16)),
# (2999.4842367999995, array([575, 583, 578, ..., 559, 565, 568], dtype=int16)],
# dtype=[('TIME', '>f8'), ('AC', '>i4', (2,))])
我需要将 AC 列从 int 转换为 float 所以我试过了:
> tbdata = tbdata.astype([('TIME', '>f8'), ('AC', '>f4', (2,))])
虽然看起来dtype 确实发生了变化
> tbdata.dtype
# dtype([('TIME', '>f8'), ('AC', '>f4', (2,))])
查看 AC 中的数据表明它们仍然是整数值。例如,sum 计算达到了int16 变量的限制(所有 AC 列的值为正):
> tbdata['AC'][0:55].sum()
# _VLF(array([31112, 31128, 31164, ..., 31203, 31232, 31262], dtype=int16), dtype=object)
> tbdata['AC'][0:65].sum()
# _VLF(array([-28766, -28759, -28702, ..., -28659, -28638, -28583], dtype=int16), dtype=object)
有什么方法可以有效改变数组数据类型?
【问题讨论】:
-
不是答案,只是好奇:根据 dtype,'AC' 字段是一个形状为 (2,) 的数组。为什么注释输出显示该字段具有更多元素?例如。
array([570, 576, 566, ..., 571, 571, 569], dtype=int16) -
我无法重现此内容,但我没有使用您的 FITS 库。一个我们可以复制和运行的独立示例会很有帮助。不要使用 FITS 数据;只需“手动”创建一个简单的 dtype 和数组即可用于演示问题。
-
@WarrenWeckesser :对于第一个问题,我不确定,但我想这与“AC”字段是 FITS 可变长度数组这一事实有关......