Astropy Fits:如何写出 table 并切掉行?
Astropy Fits: How to write out a table with rows sliced out?
我目前正在处理一些适合 table 的问题,但在 Astropy.io.fits 中输出时遇到了问题。本质上,我正在切出一堆包含我不感兴趣的对象数据的行,但是当我保存新的 table 时,所有这些行都神奇地重新出现了。
例如:
import astropy.io.fits as fits
import numpy as np
hdu = fits.open('some_fits_file.fits')[1].data
sample_slice = [True True True False False True]
hdu_sliced = hdu[sample_slice]
现在我天真的想法是 "hdu" 有 6 行,hdu_sliced 有 4 行,如果你使用 np.size() 就会得到这样的结果。所以如果我保存 hdu_sliced,新的拟合文件也将有 4 行:
new_hdu = fits.BinTableHDU.from_columns(fits.ColDefs(hdu_sliced.columns))
new_hdu.writeto('new_fits_file.fits')
np.size(hdu3)
6
所以我用切片删除的那两行由于某种原因实际上没有从 table 中删除,输出的文件与原始文件相同。
如何从 table 中删除不需要的行,然后将新数据输出到新文件?
干杯,
阿什莉
可以使用astropy.table.Table instead of astropy.io.fits.BinTable吗?
它更友好 table object。
进行行选择的一种方法是使用所需行的列表(或数组)索引到 table object:
>>> from astropy.table import Table
>>> table = Table()
>>> table['col_a'] = [1, 2, 3]
>>> table['col_b'] = ['spam', 'ham', 'jam']
>>> print(table)
col_a col_b
----- -----
1 spam
2 ham
3 jam
>>> table[[0, 2]] # Table with rows 0 and 2 only, row 1 removed (a copy)
<Table length=2>
col_a col_b
int64 str4
----- -----
1 spam
3 jam
您可以直接使用 Table
读写 FITS:
table = Table.read('file.fits', hdu='mydata')
table2 = table[[2, 7, 10]]
table2.write('file2.fits')
存在潜在问题,例如使用 Table
时不保留 FITS BINTABLE header,只有键值信息存储在 table.meta
中。您可以查阅有关 table 和 FITS BINTABLE 的 Astropy 文档,了解有关这两个 table object 的详细信息、它们如何表示数据或如何在两者之间进行转换,或者直接询问 follow-up 这里或 astropy-dev 邮件列表上的问题。
如果您想坚持使用 FITS_rec
,您可以尝试以下方法,这似乎是一种解决方法:
new_hdu = fits.BinTableHDU.from_columns(hdu_sliced._get_raw_data())
我目前正在处理一些适合 table 的问题,但在 Astropy.io.fits 中输出时遇到了问题。本质上,我正在切出一堆包含我不感兴趣的对象数据的行,但是当我保存新的 table 时,所有这些行都神奇地重新出现了。
例如:
import astropy.io.fits as fits
import numpy as np
hdu = fits.open('some_fits_file.fits')[1].data
sample_slice = [True True True False False True]
hdu_sliced = hdu[sample_slice]
现在我天真的想法是 "hdu" 有 6 行,hdu_sliced 有 4 行,如果你使用 np.size() 就会得到这样的结果。所以如果我保存 hdu_sliced,新的拟合文件也将有 4 行:
new_hdu = fits.BinTableHDU.from_columns(fits.ColDefs(hdu_sliced.columns))
new_hdu.writeto('new_fits_file.fits')
np.size(hdu3)
6
所以我用切片删除的那两行由于某种原因实际上没有从 table 中删除,输出的文件与原始文件相同。
如何从 table 中删除不需要的行,然后将新数据输出到新文件?
干杯, 阿什莉
可以使用astropy.table.Table instead of astropy.io.fits.BinTable吗?
它更友好 table object。
进行行选择的一种方法是使用所需行的列表(或数组)索引到 table object:
>>> from astropy.table import Table
>>> table = Table()
>>> table['col_a'] = [1, 2, 3]
>>> table['col_b'] = ['spam', 'ham', 'jam']
>>> print(table)
col_a col_b
----- -----
1 spam
2 ham
3 jam
>>> table[[0, 2]] # Table with rows 0 and 2 only, row 1 removed (a copy)
<Table length=2>
col_a col_b
int64 str4
----- -----
1 spam
3 jam
您可以直接使用 Table
读写 FITS:
table = Table.read('file.fits', hdu='mydata')
table2 = table[[2, 7, 10]]
table2.write('file2.fits')
存在潜在问题,例如使用 Table
时不保留 FITS BINTABLE header,只有键值信息存储在 table.meta
中。您可以查阅有关 table 和 FITS BINTABLE 的 Astropy 文档,了解有关这两个 table object 的详细信息、它们如何表示数据或如何在两者之间进行转换,或者直接询问 follow-up 这里或 astropy-dev 邮件列表上的问题。
如果您想坚持使用 FITS_rec
,您可以尝试以下方法,这似乎是一种解决方法:
new_hdu = fits.BinTableHDU.from_columns(hdu_sliced._get_raw_data())