尝试使用 astropy 将 FITS 文件转换为 ndarray 时获取 NaN 值
Getting NaN values while trying to convert FITS file to ndarray using astropy
我正在尝试使用 astropy 将 FITS 文件转换为 ndarray。我正在关注这些 instructions. I am using fv tool to look at the image in the FITS file but the table of the file is filled with only Null values:
我从 here 得到了这个 FITS 文件。当我按照 link:
中给出的说明进行操作时,我的 jupyter 笔记本中也得到了 NaN 值
image_file = 'http://jsoc.stanford.edu/SUM93/D1245657400/S00000/hmi.Ic_720s.20191218_231200_TAI.3.continuum.fits'
hdulist = fits.open(image_file)
hdulist.info()
### output:
Filename: C:\Users\yatin\.astropy\cache\download\py3\dd629fe158baf0b180d1835a3227eac4
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 PrimaryHDU 6 ()
1 1 CompImageHDU 106 (4096, 4096) int16
hdulist.verify('fix')
### output:
WARNING: VerifyWarning: HDU 1: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 74: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 'CRDER1' is not FITS standard (invalid value string: 'nan'). Fixed 'CRDER1' card to meet the FITS standard. [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 75: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 'CRDER2' is not FITS standard (invalid value string: 'nan'). Fixed 'CRDER2' card to meet the FITS standard. [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 76: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 'CSYSER1' is not FITS standard (invalid value string: 'nan'). Fixed 'CSYSER1' card to meet the FITS standard. [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 77: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 'CSYSER2' is not FITS standard (invalid value string: 'nan'). Fixed 'CSYSER2' card to meet the FITS standard. [astropy.io.fits.verify]
hdulist[1].data
### output:
array([[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]], dtype=float32)
我做错了什么?
这有点像 non-answer,但看起来您并没有做错任何事。我下载了相同的文件,虽然其中部分包含 NaN,但部分不包含。当您打印 4096x4096 图像的数据时,它不会显示所有值,而且似乎边界周围的大部分值都是 NaN(可能是光圈 cut-out?)。例如:
>>>> np.isnan(hdulist[1].data).all()
False
我可以看到一些 non-NaN 的点,例如:
>>> np.where(~np.isnan(hdulist[1].data))
(array([ 19, 19, 19, ..., 4069, 4069, 4069]),
array([2025, 2026, 2027, ..., 2092, 2093, 2094]))
实际上似乎有很多 non-NaN 值:
>>> len(np.where(~np.isnan(hdulist[1].data))[0])
12887376
如有疑问,请尝试使用 matplotlib 绘制数据。默认情况下,它将 NaN 视为空白像素:
>>> from matplotlib import pyplot as plt
>>> plt.imshow(hdulist[1].data)
我得到:
的确,NaN 看起来就像一个光圈 cut-out。
唯一可以做任何事情的 "wrong" 是编写此 FITS 文件的任何软件,因为我不认为 FITS 标准在技术上提供了一种表示 inf
和 nan
的方法header 关键字中的值,即使它可能应该...
我也遇到了同样的问题。这看起来像 Solar Dynamics Observatory HMI 连续谱图像或类似图像。正如您已经知道的,他们使用 nan 来表示 astropy.io.fits 包(版本 4.0.1)不支持的某些 CARD 值。我已经用 astropy community 发布了一份 bug/problem 报告。该报告还包括您可以对安装的 astropy.io.fits 代码进行快速破解修复的详细信息,直到真正的修复出现。 hack 提供了对 nan 的支持。
我正在尝试使用 astropy 将 FITS 文件转换为 ndarray。我正在关注这些 instructions. I am using fv tool to look at the image in the FITS file but the table of the file is filled with only Null values:
image_file = 'http://jsoc.stanford.edu/SUM93/D1245657400/S00000/hmi.Ic_720s.20191218_231200_TAI.3.continuum.fits'
hdulist = fits.open(image_file)
hdulist.info()
### output:
Filename: C:\Users\yatin\.astropy\cache\download\py3\dd629fe158baf0b180d1835a3227eac4
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 PrimaryHDU 6 ()
1 1 CompImageHDU 106 (4096, 4096) int16
hdulist.verify('fix')
### output:
WARNING: VerifyWarning: HDU 1: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 74: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 'CRDER1' is not FITS standard (invalid value string: 'nan'). Fixed 'CRDER1' card to meet the FITS standard. [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 75: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 'CRDER2' is not FITS standard (invalid value string: 'nan'). Fixed 'CRDER2' card to meet the FITS standard. [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 76: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 'CSYSER1' is not FITS standard (invalid value string: 'nan'). Fixed 'CSYSER1' card to meet the FITS standard. [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 77: [astropy.io.fits.verify]
WARNING: VerifyWarning: Card 'CSYSER2' is not FITS standard (invalid value string: 'nan'). Fixed 'CSYSER2' card to meet the FITS standard. [astropy.io.fits.verify]
hdulist[1].data
### output:
array([[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]], dtype=float32)
我做错了什么?
这有点像 non-answer,但看起来您并没有做错任何事。我下载了相同的文件,虽然其中部分包含 NaN,但部分不包含。当您打印 4096x4096 图像的数据时,它不会显示所有值,而且似乎边界周围的大部分值都是 NaN(可能是光圈 cut-out?)。例如:
>>>> np.isnan(hdulist[1].data).all()
False
我可以看到一些 non-NaN 的点,例如:
>>> np.where(~np.isnan(hdulist[1].data))
(array([ 19, 19, 19, ..., 4069, 4069, 4069]),
array([2025, 2026, 2027, ..., 2092, 2093, 2094]))
实际上似乎有很多 non-NaN 值:
>>> len(np.where(~np.isnan(hdulist[1].data))[0])
12887376
如有疑问,请尝试使用 matplotlib 绘制数据。默认情况下,它将 NaN 视为空白像素:
>>> from matplotlib import pyplot as plt
>>> plt.imshow(hdulist[1].data)
我得到:
的确,NaN 看起来就像一个光圈 cut-out。
唯一可以做任何事情的 "wrong" 是编写此 FITS 文件的任何软件,因为我不认为 FITS 标准在技术上提供了一种表示 inf
和 nan
的方法header 关键字中的值,即使它可能应该...
我也遇到了同样的问题。这看起来像 Solar Dynamics Observatory HMI 连续谱图像或类似图像。正如您已经知道的,他们使用 nan 来表示 astropy.io.fits 包(版本 4.0.1)不支持的某些 CARD 值。我已经用 astropy community 发布了一份 bug/problem 报告。该报告还包括您可以对安装的 astropy.io.fits 代码进行快速破解修复的详细信息,直到真正的修复出现。 hack 提供了对 nan 的支持。