2017-01-08 2 views
2

Hallo Ich schrieb den folgenden Python-Code, der (vermeintlich) Daten aus einer FITS-Datei extrahiert.Python numpy savetxt nicht speichern: "Tupel Index außerhalb des Bereichs"

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 ist ein N x 2 Array mit den Koordinaten für das Ziel von Interesse. Jede Ziel-FITS-Datei enthält Tausende von "Ereignissen", die mit bestimmten Koordinaten und Energien verknüpft sind. Der Code durchläuft jedes Ereignis in jedem Ziel und erfasst die Energie für Ereignisse, die ein Kriterium erfüllen (der Abstand zwischen den Zielkoordinaten und den Ereigniskoordinaten muss kleiner als eine bestimmte Zahl sein), wenn er die Kriterien erfüllt, zu denen er gespeichert wird. f "das ist ein 1D-Array, eine einfache Liste von Zahlen (etwa 23000 Nummern).

Alles funktioniert, bis der savetxt Befehl und dann spuckt er den Fehler:

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 

ich wissen muss, was schief läuft. Dieser Code funktionierte für ein anderes Beispiel.

+0

Mach dir keine Sorgen über die Funktion, func(), es ist aus interp1D gebaut und funktioniert gut – theasucksatpython

+0

Es scheint, dass 'f', die Sie speichern' savetxt' enthält nur 1 oder weniger Elemente. Die Fälle in der for-Schleife sind also nicht so oft wahr, wie sie sein sollten. Dies scheint die Zeile zu sein, in der numpy fehlschlägt: https://github.com/numpy/numpy/blob/v1.11.0/numpy/lib/npyio.py#L1118 –

+0

Wie ist die Datenstruktur von 'f'? Nach dem von Ihnen angegebenen Code zu beurteilen, macht f = [] 'f zu einer Liste. Laut [numpy docs] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html) muss der zweite Parameter der 'np.savetxt' Funktion -' X' sein " array_like " –

Antwort

0

Das erste, was savetxt tut mit Ihrem f (genannt X) ist

X = np.asarray(X) 

Dies, so es in ein Array macht. savetxt ist entworfen, um ein 2d-Array für Zahlen, eine Reihe nach der anderen in die Datei zu schreiben.

Wie Sie es erstellen, f=[], und dann Sie f.append.... Also ist es eine Liste von etwas - Listen, Arrays?

Sie müssen f betrachten und herausfinden, wie man es in ein gültiges numpy-Array verwandelt.

+0

Ich erstelle eine leere Liste und füge diese Liste dann mit Gleitkommazahlen an. Am Ende des Codes sollte die Liste "f" beispielsweise die Form haben: f = [50.02,43.21,78.91 .....] und etwa 23.000 dieser Gleitkommazahlen enthält.Wenn Sie sagen, dass das erste, was Savetxt tut, es in ein Array verwandelt, verstehe ich nicht, warum es diese Liste von Zahlen nicht zu einem Array machen und speichern kann. Sollte ich vielleicht verwenden: f = np.array (f)? – theasucksatpython

+0

Do 'arr = np.array (f)', und erzähle uns von 'arr.shape' und' arr.dtype'. – hpaulj

0

Ich habe das Problem behoben. Statt eine leere Reihe von Anhängen Ich habe eine extrem große, zweidimensionale ein:

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" 

Ich hatte gehofft, durch das Array initialisiert wird, dass es an der Zeit, wie der Computer hin und her Speicher jedes Mal, Zuteilung müssen würde nicht retten würde Es hat das Array angehängt. (In der Theorie funktioniert es schneller, aber nach meiner Erfahrung schien es das gleiche). Wie auch immer, habe ich dann einige numpy Tricks, um den 2D-Array in einen 1D-Array zu glätten, und dann löschte ich die zusätzliche Nullen mit dem folgenden Code:

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

Dann arbeitete die savetxt. Ich weiß nicht, warum es mit der vorherigen Methode nicht funktioniert hat, weil ich ein 1D-Array mit Floats gespeichert habe, und genau das tue ich hier. Ich habe es gerade überarbeitet, um Zeit zu sparen (angeblich). Sowieso. Vielen Dank für Ihre Hilfe.

Verwandte Themen