2017-01-08 16 views
2

こんにちは私はFITSファイルから(おそらくは)データを抽出する次のPythonコードを書いています。Python numpy savetxtは保存しません: "タプルのインデックスが範囲外です"

target_array=np.loadtxt(target_list) 
N=len(target_array) 
target=['target_{0}.fits'.format(i) for i in range(1,N+1,1)] 
hdu=[] 
hdudata=[] 
for i in range(N): 
hdu.append(pyfits.open(target[i])) 
hdudata.append(hdu[i][1].data) 
f=[] 
for i in range(N): 
    for j in range(len(hdudata[i])): 
     if dist(target_array[i][0],hdudata[i][j]['Ra'],target_array[i][1],hdudata[i][j]['Dec']) <= func(hdudata[i][j]['Energy']): 
          f.append(hdudata[i][j]['Energy']) 
     print "Target", i, "successfully stacked" 

np.savetxt('energy_stack.txt',f) 

target_arrayは、対象のターゲットの座標を含むN×2の配列です。各ターゲットFITSファイルには、特定の座標とエネルギーにリンクされた何千もの「イベント」が含まれています。コードは、各ターゲット内の各イベントを循環し、基準に合致するイベントのエネルギーを取り込みます(ターゲット座標とイベント座標の距離は、指定された数より少なくなければなりません) f "は1D配列で、数字の単純なリスト(約23000の数字)です。

すべてがsavetxtコマンドまで動作し、それがエラーを吐く:

Traceback (most recent call last): 
    File "pipe_stack.py", line 184, in <module> 
    get_target_energy('target_list_reduced.txt') 
    File "pipe_stack.py", line 132, in get_target_energy 
    np.savetxt('energy_stack.txt',f) 
    File "/home/heatdeath/fermi_science/ScienceTools-v10r0p5-fssc-20150518A-source/external/x86_64-unknown-linux-gnu-libc2.19-0/lib/python2.7/site-packages/numpy/lib/npyio.py", line 1118, in savetxt 
    ncol = X.shape[1] 
IndexError: tuple index out of range 

私が間違って何が起こっているかを知る必要があります。このコードは別のサンプルで動作しました。 savetxtあなたfXと呼ばれる)を行い

+0

関数func()を心配しないでください。interp1Dから構築され、うまく動作します。 – theasucksatpython

+0

'savetxt'に保存している' f'は1つ以下の項目しか含んでいないようです。したがって、forループのifの場合は、そうでなければならないほど頻繁に真ではありません。これはnumpyが失敗する行のようです:https://github.com/numpy/numpy/blob/v1.11.0/numpy/lib/npyio.py#L1118 –

+0

'f'のデータ構造は何ですか?あなたが 'f = []'と指定したコードから判断すると、fがリストになります。 [numpy docs](https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html)によると、 'np.savetxt'関数の第2引数 - ' X'は " array_like " –

答えて

0

まず最初に

X = np.asarray(X) 

これは、それが配列にそれを作ります。 savetxtは、数値の2次元配列をファイルに一度に1行ずつ書き込むように設計されています。

作成すると、f=[]、次にf.append...となります。だから、リスト、配列のようなものがリストにあります。

fを見て、有効なnumpy配列にする方法を理解する必要があります。

+0

空のリストを作成し、そのリストに浮動小数点数を追加します。コードの最後に、リスト "f"は例としてf = [50.02,43.21,78.91 .....]の形式であり、これらの浮動小数点数は約23,000です。savetxtが最初に行うことが配列に変換されていると言うなら、なぜこの番号のリストを配列に変換して保存できないのか分かりません。 私はおそらく使用する必要があります:f = np.array(f)? – theasucksatpython

+0

'arr = np.array(f)'を実行し、 'arr.shape'と' arr.dtype'について教えてください。 – hpaulj

0

問題を修正しました。代わりに、私は非常に大きく、空の配列、2次元の1を追加で:

f=np.zeros((N,1e6)) 
for i in range(N): 
    for j in range(len(hdudata[i])): 
     if dist(target_array[i][0],hdudata[i][j]['Ra'],target_array[i][1],hdudata[i][j]['Dec']) <= func(hdudata[i][j]['Energy']): 
      f[i][j]=hdudata[i][j]['Energy'] 
    print "Target", i, "successfully stacked" 

は、私は、コンピュータがメモリを毎回割り当て前後に行かなければならないだろうとして、それは時間の節約になるという配列を初期化することを望みましたそれは配列を追加しました。 (理論的には速く働いていますが、私の経験では同じように見えました)。とにかく、私は、1次元配列に2次元アレイを平坦化するためにいくつかのnumpyのトリックを使用し、私は次のコードで余分なゼロを削除:

f=np.ndarray.flatten(f) 
f=f[f!=0] 
np.savetxt('energy_stack.txt',f) 

そしてsavetxtが働きました。私は浮動小数点数でいっぱいの1D配列を保存していたので、以前の方法ではうまくいかなかった理由は分かりません。私はここでやっていることをちょうど(おそらく)時間を節約するために書き直しました。とにかく。あなたの助けをありがとう。

関連する問題