我正在尝试使用以下代码为FITS文件中的像素设置阈值。但是,我收到的错误是:
IndexError: Index 2620 is out of bounds for axis 0 with size 2620
有关如何解决此问题的任何想法?
这是代码:
from astropy.io import fits
import numpy as np
hdulist = fits.open("12ratio.fits")
origImData = hdulist[0].data
newImData = origImData*0
for x, y in np.nditer(origImData.shape):
curPixel = origImData[x, y]
if curPixel > 0.28 or curPixel < 3.11:
newImData[x, y] = curPixel
else:
newImData[x, y] = 0
newhdu = fits.PrimaryHDU(newImData)
newhdulist = fits.HDUList([newhdu])
newhdulist.writeto('modifiedratio12.fits')
答案 0 :(得分:1)
问题是你的迭代方案。您正在迭代数组的 shape ,而不是像素索引。
一般来说,有一种更好的屏蔽方法:
mask = (origImData > 0.28) & (origImData < 3.11)
newImData[mask] = origImData[mask]
将实现您的目标。
或同样有效:
from astropy.io import fits
import numpy as np
hdulist = fits.open("12ratio.fits")
origImData = hdulist[0].data
mask = (origImData > 0.28) & (origImData < 3.11)
origImData[~mask] = 0
newhdu = fits.PrimaryHDU(data=origImData, header=hdulist[0].header)
newhdu.writeto('modifiedratio12.fits')
这里我使用了numpy数组boolean not
操作(~
)来反转掩码。我也跳过了HDUList
,因为单扩展FITS文件不需要。{/ p>
您显示的代码中有两个错误:
for x, y in np.nditer(origImData.shape):
将x
和y
分配origImData.shape
的值,即x=2640
和y=(something else)
,不会分配它们您想要的值0,1,...,2640
。
比较操作:
if curPixel > 0.28 or curPixel < 3.11:
对于实数始终为真:所有数字都大于0.28或小于3.11。