以前の投稿dtype
で、 の変更はrecarray
を使用して実行できることを見てきましたastype
。recarray
ただし、列の1つに配列がある でそれを行うことはできません。
Myrecarray
は 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)
配列のデータ型を効果的に変更する方法はありますか?