我正在尝试使用FITS文件。我有以下代码:

from astropy.io import fits
from astropy.wcs import WCS

hdul = fits.open(fitsfilename)[0]

wcs = WCS(hdul.header)


它给了我这些警告:


  警告:Verify警告:验证报告错误:
  [astropy.io.fits.verify]警告:VerifyWarning:卡“ A_2_0”不是
  FITS标准(无效值字符串:'3.29341755408e-05')。固定
  符合FITS标准的“ A_2_0”卡。 [astropy.io.fits.verify]
  警告:Verify警告:注意:astropy.io.fits使用从零开始
  索引。 [astropy.io.fits.verify]警告:Verify警告:卡
  “ A_1_1”不是FITS标准(无效值字符串:
  '1.51709339878e-05')。修复了“ A_1_1”卡符合FITS标准的问题。
  [astropy.io.fits.verify]警告:验证警告:卡“ A_0_2”不是
  FITS标准(无效值字符串:“ 5.17973753556e-06”)。固定
  符合FITS标准的“ A_0_2”卡。 [astropy.io.fits.verify]
  警告:验证警告:卡“ B_2_0”不是FITS标准(无效
  值字符串:“ 2.97627426087e-06”)。固定了“ B_2_0”卡以满足
  FITS标准。 [astropy.io.fits.verify]警告:Verify警告:卡
  “ B_1_1”不是FITS标准(无效值字符串:
  '2.71948126373e-05')。修复了“ B_1_1”卡符合FITS标准的问题。
  [astropy.io.fits.verify]警告:Verify警告:卡“ B_0_2”不是
  FITS标准(无效值字符串:“ 1.66848449653e-05”)。固定
  符合FITS标准的“ B_0_2”卡。 [astropy.io.fits.verify]
  警告:验证警告:卡“ AP_1_0”不是FITS标准(无效
  值字符串:“ 1.79541533196e-06”)。固定了“ AP_1_0”卡以满足
  FITS标准。 [astropy.io.fits.verify]警告:Verify警告:卡
  “ AP_0_1”不是FITS标准(无效值字符串:
  '9.20624843151e-07')。修复了“ AP_0_1”卡符合FITS标准的问题。
  [astropy.io.fits.verify]警告:VerifyWarning:卡“ AP_2_0”不是
  FITS标准(无效值字符串:“-3.29292923201e-05”)。固定
  “ AP_2_0”卡符合FITS标准。 [astropy.io.fits.verify]
  警告:验证警告:卡“ AP_1_1”不是FITS标准(无效
  值字符串:“-1.51738446887e-05”)。修复了“ AP_1_1”卡可以满足
  FITS标准。 [astropy.io.fits.verify]警告:Verify警告:卡
  “ AP_0_2”不是FITS标准(无效值字符串:
  '-5.18321445978e-06')。修复了“ AP_0_2”卡符合FITS标准的问题。
  [astropy.io.fits.verify]警告:VerifyWarning:卡“ BP_1_0”不是
  FITS标准(无效值字符串:'8.99029048217e-07')。固定
  “ BP_1_0”卡符合FITS标准。 [astropy.io.fits.verify]
  警告:验证警告:卡“ BP_0_1”不是FITS标准(无效
  值字符串:“ 1.15967736014e-06”)。修复了“ BP_0_1”卡满足
  FITS标准。 [astropy.io.fits.verify]警告:Verify警告:卡
  “ BP_2_0”不是FITS标准(无效值字符串:
  '-2.97837492348e-06')。修复了“ BP_2_0”卡符合FITS标准的问题。
  [astropy.io.fits.verify]警告:VerifyWarning:卡“ BP_1_1”不是
  FITS标准(无效值字符串:“-2.71998518336e-05”)。固定
  符合FITS标准的“ BP_1_1”卡。 [astropy.io.fits.verify]
  警告:VerifyWarning:卡“ BP_0_2”不是FITS标准(无效
  值字符串:“-1.66872388359e-05”)。修复了“ BP_0_2”卡满足
  FITS标准。 [astropy.io.fits.verify]警告:Verify警告:卡
  “ WCSR_PRJ”不是FITS标准(无效值字符串:“ 3.6679e-07”)。
  修复了“ WCSR_PRJ”卡符合FITS标准的问题。
  [astropy.io.fits.verify]警告:VerifyWarning:卡“ WCSR_PIX”为
  不是FITS标准(无效值字符串:'8.2565e-05')。固定
  “ WCSR_PIX”卡符合FITS标准。 [astropy.io.fits.verify]


固定的“ A_2_0”卡符合FITS标准意味着什么?卡A_2_0指向的数据发生了什么?我也对警告的含义感兴趣:VerifyWarning:注意:astropy.io.fits使用基于零的索引。

最佳答案

正如注释中已经指出的那样,io.fits具有用于verifying the validity of headers的功能,甚至可以修复一些琐碎的格式错误(它会尽最大努力仅尽可能地写入完全有效的FITS文件)。

尽管存在写文件时如何执行验证的选项,但在某些情况下,文件在读取时也执行自动验证,尤其是在解析标头时。这是一个long standing open issue(这只是一个相关的示例;有几个),目前没有很好的方法来控制读取时间验证/修正。有一种更简单的方法可以将此静音或完全禁用它可能会很好。我认为这不会太难解决,我猜只是没有人有足够的动力。尽管当前,如果您希望使警告静音,则可以使用标准的Python warnings system来使其静音。

顺便说一句,关于警告本身的含义,我认为可能是在科学记数法中使用e而不是E(FITS标准可以追溯到FORTRAN时代,后者更常见我认为)。如果消息能更好地准确解释其修复内容,那就太好了。

注释“注意:astropy.io.fits使用基于零的索引。”从技术上讲,它只是第一条警告消息的一部分,并且主要出于历史原因而存在。将其添加到此消息中的事实甚至是一个小错误,因为该消息甚至还提到了任何索引(在过去,它可能说过一些有关“卡[N]中的错误”的内容,其中N为卡的索引)。出现此消息的原因只是提醒那些更习惯使用基于1的索引的FORTRAN和/或IRAF的用户,而PyFITS / astropy.io.fits使用基于0的索引来提供HDU编号和标头卡号由C和Python使用。在这一点上,它可能会被删除,或者至少固定为仅附加到与之实际相关的警告消息中。

10-06 02:19