4

以前の投稿dtypeで、 の変更はrecarrayを使用して実行できることを見てきましたastyperecarrayただし、列の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)

配列のデータ型を効果的に変更する方法はありますか?

4

2 に答える 2

0

recarrayこの問題は、fits ファイルから再現できます。回避策は、を適切なテーブルとしてロードし、recarrayそれを pandas データフレームに変換することです。

from astropy.table import Table
import pandas as pd

t = Table.read('file.fits')
df = pd.DataFrame.from_records(t, columns=t.columns) 
df.AC = df.AC.astype(float)
于 2016-01-12T08:58:27.230 に答える