我正在尝试编写一个简单的脚本,该脚本将在拟合图像文件中读取,将所有低于某个阈值的像素(我将根据背景统计信息输入)设置为零或南。我在下面包含了我正在使用的代码。这会写一个类似于原始文件的新拟合文件,但像素值似乎是重新缩放的(即,我希望新文件中的最小值是我指定的最小值,但事实并非如此)。我认为这是一个问题,我如何编写新文件的标题,但不知道如何解决它,并欢迎任何做过类似事情的天文学家的建议或片段。谢谢!
import astropy.io.fits as fits
import numpy as np
f=fits.open('filename.fits')
data = f[0].data
header = f[0].header
data[data<noise_cutoff]=np.nan
fits.writeto('outfilename.fits', data, header)
f.close()
答案 0 :(得分:-1)
在python 2.7中,我总是这样做:
img[numpy.where(img<min_flux)]=0
img[numpy.where(img>0)]+=add_flux
看到区别:
这将返回满足条件的字段的实际值:
>>> data2[data2>noise_cutoff]
array([ 0.15600586, 0.15576172, 0.16992188, ..., 0.15063477,
0.21899414, 0.15722656], dtype=float32)
返回条件返回True
的索引:
>>> np.where(data2>noise_cutoff)
(array([ 0, 0, 0, ..., 1488, 1488, 1488]), array([ 88, 789, 1065, ..., 1683, 1833, 1872]))
你想将index的值设置为nan或0,我不知道第一个是如何被解释为,但根据经验,我知道它不起作用。
修改强>
我对处理nan值的FITS查看器也有不好的经验。通常人们会写一个拟合字段,即RANGE
,它应该描述所有可能的值。我经常看到[0, 65535]
,但它主要是协议和数据类型(毕竟它是FITS格式)。
我也对发送索引和值之间的差异感到好奇,这就是我所做的:
首先显示一些默认值:
>>> data
array([[ 0.01800537, 0.00421143, -0.01644897, ..., -0.03686523,
0.05981445, -0.00924683],
[-0.00267029, -0.02334595, 0.03179932, ..., 0.09436035,
0.05981445, 0.00457001],
[-0.13354492, -0.0302124 , -0.00266266, ..., 0.05291748,
-0.06445312, 0.09436035],
...,
[ 0.04669189, -0.02218628, -0.06347656, ..., -0.01507568,
0.10229492, 0.02636719],
[ 0.00536346, -0.00842285, 0.04669189, ..., -0.00816345,
0.00565338, -0.02886963],
[-0.07043457, -0.00840759, -0.09106445, ..., 0.06787109,
-0.11865234, -0.05645752]], dtype=float32)
我制作了一份副本,因为我没有编辑我需要的原始文件,然后我采用了data2[data2>noise_cutoff]
和np.where(data2>noise_cutoff)
并将结果复制了一段时间,并将其作为一个有效的表达式复制到了[ ]
运营商。
>>> data2 = data.copy
# result of data2[data2>noise_cutoff]
>>> data2[[0.21899414, 0.15722656]]
array([[ 0.01800537, 0.00421143, -0.01644897, ..., -0.03686523,
0.05981445, -0.00924683],
[ 0.01800537, 0.00421143, -0.01644897, ..., -0.03686523,
0.05981445, -0.00924683]], dtype=float32)
#result of np.where(data2>noise_cutoff)
>>> data2[[0,0, 0, 1488, 1488, 1488], [88,789,1065,1683,1833,1872]]
array([ 0.15600586, 0.15576172, 0.16992188, 0.15063477, 0.21899414,
0.15722656], dtype=float32)
所以似乎numpy喜欢解包发送给[ ]
的参数。例如,发送data2[[1, 2]]
将返回data2
的第一行和第二行。由于我发送了浮点值0.21899414
和0.15722656
,因此显然会将其转换为int
s,向下舍入为0
,并且第一行返回两次。
然后在data2[[1],[1]]
中发送会在data[1,1]
处返回一个浮点数。在这些返回的列表中发送一系列在这些索引处写入的值,即data2[[1,2], [1,2]]
为您提供元素[1,1]
,[2,2]
>>> data2[1,1] == data2[[1],[1]]
array([ True], dtype=bool)