Seite 1 von 1

Probleme mit numpy.savetxt

Verfasst: Dienstag 23. April 2013, 17:29
von Lemi89
Hallo alle zusammen,

nachdem ich bisher immer heimlich mitgelesen habe und mir immer wieder tolle Anregungen hohlen konnte, muss ich mich jetzt auch mal mit einer Frage hier an das Forum wenden.

Ich programmiere aktuell an einer Auswerteroutine, welche mir aus einer Zeitserie eine Häufigkeitsverteilung berechnen soll, bzw. dies nur über eine gewisse Spanne der Zeitserie. Das ganze habe ich vor einiger Zeit schonmal selbst programmiert und wollte jetzt, da ich aktuell mein Auswertetool umschreibe, das ganze in numpy realisieren. Grund ist zum einen das Üben mit Numpy und zum anderen wird der Code besser wartbar, da wir hier in unserer Arbeitsgruppe zu mehrt daran arbeiten. Weiterhin wollte ich mal den numba Jit-Compiler testen.

Der Problemcode sieht wie folgt aus

Code: Alles auswählen

import numpy as np

def freqdist(inputarray,internal_switches,config_file, peptide_name):
    
    #Bestimmung der Auswertespanne
    eval_start_lenght = (inputarray[1].size-config_file["anal_lenght"]*1000)
    eval_end_lenght = inputarray[1].size

    #Wenn es Prozentwerte sind dann
    if internal_switches["percent"]==True:
        alpha_distri, bin_edges=np.histogram(inputarray[1,0,eval_start_lenght:eval_end_lenght],bins=100,range=(0,1),density=True)
        beta_distri, bin_edges=np.histogram(inputarray[2,0,eval_start_lenght:eval_end_lenght],bins=100,range=(0,1),density=True)

    #Aktuell noch ein Dummy
    else:
        print("ACTUALLY NOT IMPLEMENTED")
        return

    #Ausgabesektion
    outfile=open("%s/%s_freqdist.dat" % (config_file["outpath"],peptide_name), 'wb')
    np.savetxt(outfile, (bin_edges,alpha_distri), fmt='%.8f')
Kurz zur Erklärung. Die Funktion bekommt ein Array mit 3 Spalten (hier inputarrray) und berechnet dann für zwei dieser Spalten die Verteilung. Die Dritte ist hier erstmal unwichtig und wird für andere Sachen benötigt. Mein Problem ist jetzt die np.savetxt. Die Funktion geht wunderbar, wenn ich ihr nur eines der Arrays gebe, egal welches. Sobald ich aber zwei oder mehr Arrays in den Output schreiben will, bekomme ich Probleme. Da leider der Output sehr essentiell ist, muss ich das irgendwie hinbekommen. Die Fehlermeldung ist folgende:

Code: Alles auswählen

  File "/home/alex/anaconda/envs/py3k/lib/python3.3/site-packages/numpy/lib/npyio.py", line 1047, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: only length-1 arrays can be converted to Python scalars
Ich habe die Sufu hier schon bemührt, leider haben mir die gefundenen Threads nicht wirklich eine Antwort geliefert. Ich würde ja auch die Ausgabe verstehen wenn eines der Eingangsarrays problematisch wäre (also mehrdimensional), so ist es allerdings nicht. Ich wäre froh um jegliche art der Hilfe, da ich nach ca. 2h googlen nicht wirklich weiter gekommen bin.

LG

Lemi

Re: Probleme mit numpy.savetxt

Verfasst: Dienstag 23. April 2013, 18:11
von EyDu
Hallo und willkommen im Forum!

Die savetxt-Funktion nimmt nur array_like-Objekte an, du kannst da nicht einfach ein Tupel reindrücken. Wenn es sinnvoll ist, dann kannst du die Daten zu einem Array zusammenpacken. numpy.vstack könnte dir dabei helfen.

Wenn du einen Code-Block als "noch nicht implementiert" markiren möchtest, dann solltest du an der Stelle einen "NotImplementedError" werfen und nicht einfach eine Ausgabe machen. Dann stoplerst du auch über die Stelle.

Vergleiche auf ``x == True`` sind immer sinnlos. Wenn x bereits True ist, dann kommt nur wieder True aus. Ist x False, dann wieder x. Du kannst dir das ``== True`` also sparen.

Wenn du Dateien öffnest, dann solltest du dazu das with-Statement verwenden. Dann ist auch sichergestellt, dass die Dateien wieder geschlossen werden, falls ein Fehler auftritt. Bei dir ist nicht sichergestellt, dass die Datei am Ende des Scripts überhaupt geschlossen, und damit ggf. auch geschrieben, wird. numpy.savetxt nimmt übrigens auch einen Dateinamen entgegen, du musst die Datei gar nicht von Hand öffnen.

Wenn du Dateipfade zusammensetzt solltest du dies auch nicht per Hand machen, da schleichen sich nur Fehler ein. Nutze dazu die os.path.join-Methode.

Zeilen sollte nicht länger als 80 Zeichen sein (siehe PEP 8).

Re: Probleme mit numpy.savetxt

Verfasst: Donnerstag 25. April 2013, 07:48
von Lemi89
Hi EyDu,

vielen Dank für die Tipps haben mir viel weitergeholfen. Habe das ganze jetzt gelöst, allerdings mit einer selbstgeschriebenen Output funktion, da mir die von Numpy nicht das geliefert hat, was ich wollte (bzgl. Formatierung). Das mit dem Tuple war mir auch schon komisch, allerdings war das so ähnlich in der Doc von Numpy gezeigt. Aber nur so wird man klug :D

Wegen den anderen Sachen auch vielen Dank, habe schon nachgebesser, auch im restlichen Programmcode (sind immerhin fast 1000 Zeilen mittlerweile). Das mit den Errors muss ich mir nochmal genauer anschauen. Umgeschrieben auf with habe ich auch bereits und ja die 80 Zeichen *huestel* ich probiers so gut es geht :lol: