1

フィット画像ファイルを読み取り、特定のしきい値 (バックグラウンド統計に基づいてフィードする) を下回るすべてのピクセルをゼロまたは nan に設定する簡単なスクリプトを作成しようとしています。私が使用しているコードの下に含めました。これにより、元のファイルに似た新しい fit ファイルが書き込まれますが、ピクセル値が再スケーリングされているように見えます (つまり、新しいファイルの最小値が指定した最小値であると予想されますが、そうではありません)。新しいファイルにヘッダーを書き込む方法に問題があると思いますが、修正方法がわかりません。同様のことを行った天文学者への提案やスニペットを歓迎します。ありがとう!

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()
4

1 に答える 1

-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]))

インデックスの値を nan またはゼロに設定したいのですが、最初の値がどのように解釈されるかはわかりませんが、経験から、それが機能しないことはわかっています。

編集 nan 値を処理する FITS ビューアーについても悪い経験があります。通常、人々は fit フィールドを書きます。つまり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]]すると の 1 行目と 2 行目が返されdata2ます。float 値を送信したので0.218994140.15722656それらは明らかに s としてキャストされint、切り捨てられて0になり、最初の行が 2 回返されました。

ただし、a を送信するとdata2[[1],[1]]、float at が返されdata[1,1]ます。これらの両方のリストを送信すると、これらのインデックスに書き込まれた一連の値が返されdata2[[1,2], [1,2]]ます[1,1][2,2]

>>> data2[1,1] == data2[[1],[1]]
array([ True], dtype=bool)
于 2015-03-07T16:55:13.270 に答える