Denk Fehler in list comprehension ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Gibt es denn sowas wie,

Code: Alles auswählen

y1 = np.arange(256)
y2=y1
z = np.zeros((256,256))
z[0:2] = [y1,y2]
Sodass ich keine Schleife brauche um y1, y2 nacheinander zu z zu addieren.
Zuletzt geändert von feldmaus am Freitag 5. Juni 2009, 14:51, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

abs_data = np.abs(self.daten[2])
for j, data in enumerate(self.daten[0]):
    i = int(256*math.modf(data/self.rastertime)[0])
    z[i] += np.histogram([vektor[j] for vektor in abs_data] ,bins=256,range=(u,o))[0]
Vielleicht könnte man die LC auch durch einen Generator ersetzen, ich habe mir die Schnittstelle nicht angeschaut.
Das Leben ist wie ein Tennisball.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Die np.abs() Funktion scheint unmengen Resourcen zu verschleudern, aber
irgendwie brauche ich die...

Performance geht vor, hatte mein Prof. gesagt !
Wie muss man komplexe Zahlen in np.histogram() verstehen ?
BlackJack

@feldmann_markus: Kannst Du vielleicht mal ein kleines, in sich geschlossenes Beispiel mit Eingabedaten zeigen und Ausgabedaten die irgendwie was enthalten, so dass man auch nachvollziehen kann, ob man bei Veränderungen am Quelltext auch wirklich immer noch das gleiche Ergebnis bekommt?

Dein letztes Beispiel mit den Daten musste man nämlich noch ein wenig ändern, dass man es wirklich laufen lassen konnte und das Ergebnis von `z` sah ziemlich eintönig aus:

Code: Alles auswählen

array([[ 2.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ...,
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]]
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Danke BlackJack,

hier mal ein minimal Beispiel,
http://pastebin.com/m29810f5b

In meinem Programm hatte er die komplexen Variablen o,u akzeptiert,
nur in diesem Beispiel macht es mir ärger. Den Fehler konnte ich nicht
finden.

Danke und Grüße Markus
BlackJack

Was sind das überhaupt für Daten? Du sprichst von Amplituden, aber wie soll ich mir denn eine komplexe Zahl als Amplitude vorstellen? Brauchst Du irgendwo in diesem ganzen Algorithmus die Daten als komplexe Zahlen, oder könnte man diese Umwandlung nicht *einmal* am Anfang erledigen?

Zu der Frage solltest Du Dir auch einmal die Ausgabe von `np.histogram()` mit zwei komplexen Zahlen, die aber den gleichen `abs()`-Wert haben anschauen. Da kommt nämlich etwas unterschiedliches raus:

Code: Alles auswählen

In [780]: np.histogram([1+0j, 0+1j])
Out[780]:
(array([1, 0, 0, 0, 0, 0, 0, 0, 0, 1]),
 array([ 0. +1.j ,  0.1+0.9j,  0.2+0.8j,  0.3+0.7j,  0.4+0.6j,  0.5+0.5j,
        0.6+0.4j,  0.7+0.3j,  0.8+0.2j,  0.9+0.1j]))

In [781]: np.histogram([1, 1])
Out[781]:
(array([0, 0, 0, 0, 0, 2, 0, 0, 0, 0]),
 array([ 0.5,  0.6,  0.7,  0.8,  0.9,  1. ,  1.1,  1.2,  1.3,  1.4]))
Was davon willst Du?
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:@feldmann_markus: Dein letztes Beispiel mit den Daten musste man nämlich noch ein wenig ändern, dass man es wirklich laufen lassen konnte und das Ergebnis von `z` sah ziemlich eintönig aus:

Code: Alles auswählen

array([[ 2.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ...,
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]]
Ja so sieht mein z mit den minimalen test daten auch aus.

z enthält ja nur die Häufigkeit der peaks und da ich 3 mal 6 peaks(y1,y2 und y3) habe
muss sum(z) 18 ergeben. Z.b besagt der wert z[0][0], der 2 ist wie man oben sehen
kann, dass im Zeitfeld x=20ms/256 zwei Peaks miti der Amplitude y=(MAX-MIN)/256
gemessen wurden. Die restlichen 16 Peaks liegen wo anders in z.

Wäre z[128][128] ein wert von 16, dann hätte ich bei 10ms gleich 16 peaks
von (MAX-MIN)/2 als Amplitude. Es wäre natürlich auch möglich das diese Peaks bei
30ms=(20+10)ms aufgetreten sind, oder bei 50ms=(40+10)ms u.s.w., also
alle 20ms weiter. Daher auch die Zeile 34 in meinem code,
http://pastebin.com/m29810f5b

Weiter oben hatte ich ja einen link gepostet wo man mein x,y,z sehen kann.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:Was sind das überhaupt für Daten? Du sprichst von Amplituden, aber wie soll ich mir denn eine komplexe Zahl als Amplitude vorstellen?
Na ja eine komplexe Amplitude besitzt zwei Information, einmal ihren Betrag und ihre
Phase, aber für die Betrachtung mit diesem Programm ist die Phase nicht wichtig, außer
wenn mein Prof. das so will, dann gilt das aber eher für meinen Nachfolger. Der andere
Punkt ist halt die Performance und die geht halt stark runter wenn ich Betrags Bildung
mache, sind ja schließlich ein paar Operationen mehr.

Im Prinzip ist es nicht so wichtig ob komplex oder Betrag, die Performance spielt hier eine
größere Rolle. Wichtig ist halt die Grafik richtig interpretieren zu können, nur komplex
wäre es halt komplizierter. Aber was sein muss muss sein.
BlackJack hat geschrieben:Brauchst Du irgendwo in diesem ganzen Algorithmus die Daten als komplexe Zahlen, oder könnte man diese Umwandlung nicht *einmal* am Anfang erledigen?
Eher ungünstig, da mein Programm von meinem Nachfolger mal in Realtime übersetzt
werden soll und dann ist nichts mehr mit vorher erledigen.
BlackJack hat geschrieben:Was davon willst Du?
komplex, da ich dann für 80e3 Peaks nur 20 bis 30 sek. benötige. Bei den Beträgen
war ich mal kurzzeitig essen und auf toilette...

Grüße Markus
BlackJack

@feldmann_markus: Das kann nicht sein, so komplex (hui ein Wortspiel) ist es nicht von allen Daten den Betrag zu bilden und danach hast Du auch nur noch die Hälfte der Daten. Da muss irgend etwas anderes schief laufen. Zum Beispiel hattest Du, wenn ich mich richtig erinnere, bei mindestens einem Codeschnippsel die `abs()`-Funktion auf alle Daten in der innersten Schleife.

Und wie schon gesagt: Es kommt bei der Histogrammbildung etwas anderes heraus, weil Du bei komplexen Zahlen eben nicht nur die Amplitude, sondern auch die Phase berücksichtigst.

Du solltest irgendwie von Python-Schleifen weg kommen und die Stärken von `numpy` besser nutzen. Da war es vielleicht sogar eine schlechte Idee vorher schon nach Peaks zu filtern, weil die Daten damit nicht mehr so schön regelmässig sind.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:@feldmann_markus: Das kann nicht sein, so komplex (hui ein Wortspiel) ist es nicht von allen Daten den Betrag zu bilden und danach hast Du auch nur noch die Hälfte der Daten. Da muss irgend etwas anderes schief laufen. Zum Beispiel hattest Du, wenn ich mich richtig erinnere, bei mindestens einem Codeschnippsel die `abs()`-Funktion auf alle Daten in der innersten Schleife.
Ja die abs Funktion wird auf,
np.abs[array[...],array[...],array[...]]
angewendet, ob das das Problem war ?
Hmm da könntest Du verdammt noch mal recht haben, muss ich morgen testen.
BlackJack hat geschrieben:Und wie schon gesagt: Es kommt bei der Histogrammbildung etwas anderes heraus, weil Du bei komplexen Zahlen eben nicht nur die Amplitude, sondern auch die Phase berücksichtigst.
Ja ich schaue mir morgen mal das abs() Problem an und ob die komplexen Ergebnisse
interpretierbar sind.
BlackJack hat geschrieben:Du solltest irgendwie von Python-Schleifen weg kommen und die Stärken von `numpy` besser nutzen. Da war es vielleicht sogar eine schlechte Idee vorher schon nach Peaks zu filtern, weil die Daten damit nicht mehr so schön regelmässig sind.
Ja numpy ist wirklich ein mächtiges Werkzeug, und da habe ich mir schon ne Menge in
den letzten 2 Wochen angeschaut.

Die Frage ob es sinnig ist, die peaks nicht aus den ursprünglichen Daten rauß zu filtern
hatte ich mir auch schon gestellt. Aber wenn mein Mess-Programm richtig eingestellt ist,
dann sollten nur wenige peaks im verhältnis zu den gesamten daten aufgenommen
werden.

Grüße Markus
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Kleine Änderung bei meinem minimal Beispiel, ich habe die Kriterium wieder
mit rein gebracht, da ich bei einem Peak gleiche y1,y2 und y3 mit
einbeziehe, egal ob in y2 oder nur in y1,y2 oder in allen 3 ein Peak vorkam.
http://pastebin.com/m74135b7f
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ergänzung zu meinem Bespiel code,
http://pastebin.com/m2b2d58f

diese Ergänzung behebt den bug, dass er bei einem peak in der Zeile j
gleich y1[j],y2[j] und y3[j] in das histogramm einbezieht.

Ich bin gerade am testen der abs() Funktion. Diese wende ich jetzt auf das
zu übergebende Array an und nicht mehr auf die gesamten Arrays in daten2.

Grüße Markus
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ich bin gerede dabei ein Bug mit der Bestimmung dermaximalen und minimalen Amplitude zu
beseitigen, leider bekomme ich aber Fehler.

Code: Alles auswählen

f_dat = open('../../../peakswerteundzeit.dat','rb')
self.daten = cPickle.load(f_dat)
criterium = np.array(self.daten[1]==np.int_(1))
self.peakvaluemax = np.amax(np.abs(self.daten[2][criterium]))
TypeError: only integer arrays with one element can be converted to an index
Was mache ich falsch ?

Grüße Markus
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

feldmann_markus hat geschrieben:Was mache ich falsch ?
Ok ich habe folgendes gemacht:
self.peakvaluemax = np.amax(np.abs(np.asarray(self.daten[2])[criterium]))*1.01
Antworten