0

我正在尝试使用下面的代码为 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')
4

1 回答 1

1

问题是您的迭代方案。您正在迭代数组的形状,而不是像素索引。

一般来说,有一种更好的掩蔽方法:

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 数组布尔not运算 ( ~) 来反转掩码。我也跳过了制作一个HDUList,因为单扩展 FITS 文件不需要它。

您显示的代码中有两个错误:

for x, y in np.nditer(origImData.shape):

将分配xy的值origImData.shape,即x=2640y=(something else),它不会为它们分配0,1,...,2640您想要的值。

比较操作:

    if curPixel > 0.28 or curPixel < 3.11:

对于实数总是如此:所有数字要么大于 0.28,要么小于 3.11。

于 2015-06-16T05:27:32.303 回答