Seite 1 von 1
meine Normierungsfunktion streikt manchmal
Verfasst: Freitag 16. Juni 2017, 20:45
von pyzip
Hallo,
habe mich gerade im Forum angemeldet und bitte um Hilfe. Bin blutiger Python-Anfänger und bitte um Nachsicht, falls ich großen Blödsinn abfrage.
Habe folgende Funktion definiert:
Code: Alles auswählen
def normieren(wert, min, max, min_norm, max_norm):
""" normiert wert aus Bereich [min,max] in [min_norm,max_norm] """
x = (((wert - min) * ((max_norm - min_norm) / (max - min))) + min_norm)
return x
Ich habe mir eine Matrix y mit 10 Reihen und 3 Spalten mit Zufallszahlen zwischen 1 und 50 gefüllt. Der Aufruf:
n_wert = normieren(y, 0, 1, 1, 50) wird ausgeführt und n_wert enthält die normierten Werte als 10:3-Matrix.
Wenn in nun aus y die dritte Reihe nehme: r_2 = [y[2, :]] und normieren anwende: n_wert3 = normieren(r_2, 0, 1, 1, 50) bekomme ich folgende Fehlermeldung:
The debugged program raised the exception unhandled TypeError
"unsupported operand type(s) for -: 'list' and 'float'"
File: /home/zip/python3/norm.py, Line: 171
Diese Fehlermeldung bringt mich leider nicht weiter. Ich vermute, dass ich die einzelne Reihe nicht richtig erzeuge, habe aber keine Idee, was da falsch sein könnte!
Wäre schön, wenn sich jemand das mal anschaut und mir einen Tip gibt.
Ich arbeite unter "eric6" mit Python3 und numpy ist auch geladen...
Danke und einen schönen Abend.
Gruß Rainer
Re: meine Normierungsfunktion streikt manchmal
Verfasst: Freitag 16. Juni 2017, 20:49
von BlackJack
@pyzip: Die Rechenoperationen funktionieren nicht mit Listen (ausgenommen ``+``, was aber bei Listen nicht das macht was Du willst). Du müsstest die Reihe schon als Numpy-Array übergeben und nicht in eine Liste stecken. Listen sind die Dinger die man erzeugt wenn man einen einen oder mehrere durch Komma getrennte Werte in eckige Klammern fasst. Vielleicht willst Du das mit der Liste ganz einfach sein lassen, denn Du steckst da ja ein Numpy-Array als einzige Element rein.
Re: meine Normierungsfunktion streikt manchmal
Verfasst: Freitag 16. Juni 2017, 21:01
von pyzip
Hallo BlackJack,
danke für die rasche Antwort! Und natürlich fehlen bei meiner Frage wichtige Infos...
Ich bin von Haus aus VB-6-user und will mich endgültig von der Window-Platform verabschieden, deshalb meine Wahl für Pyton.
Ich habe Testdateien, die alle möglichen Daten enthalten und mein y erzeuge ich mit der Funktion
y = np.loadtxt("/home/zip/python3/test01.txt", delimiter=",", usecols=(0,1,2))
Also ist mein y doch ein Numpy-Array, dem ich doch einzelne Reihen oder Spalten entnehmen kann. Verstehe halt nicht, warum die Funktion mit y klappt und mit einem Slice (ist das der richtige Ausdruck?) nicht.
Re: meine Normierungsfunktion streikt manchmal
Verfasst: Freitag 16. Juni 2017, 21:15
von BlackJack
@pyzip: Dein `y` ist ein Numpy-Array. Aber eine Liste ist kein Numpy-Array sondern eine Liste, auch wenn *in* der Liste ein Numpy-Array (als einziges Element) steckt. Lass das in eine Liste stecken einfach mal sein:
Code: Alles auswählen
In [45]: y = numpy.random.random((5, 5))
In [46]: type(y)
Out[46]: numpy.ndarray
In [47]: y[2, :]
Out[47]: array([ 0.79813442, 0.25663436, 0.70418162, 0.57948189, 0.30686676])
In [48]: type(y[2, :])
Out[48]: numpy.ndarray
In [49]: [y[2, :]]
Out[49]: [array([ 0.79813442, 0.25663436, 0.70418162, 0.57948189, 0.30686676])]
In [50]: type([y[2, :]])
Out[50]: list
In [51]: y[2, :] - 10
Out[51]: array([-9.20186558, -9.74336564, -9.29581838, -9.42051811, -9.69313324])
In [52]: [y[2, :]] - 10
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-53-9b6abc69dec9> in <module>()
----> 1 [y[2, :]] - 10
TypeError: unsupported operand type(s) for -: 'list' and 'int'
Re: meine Normierungsfunktion streikt manchmal
Verfasst: Freitag 16. Juni 2017, 21:38
von pyzip
Hallo BlackJack, glaube, dass ich das mit den Typen verstanden habe. Dein Beispiel ist ja sehr schön! Muß jetzt meinen Code mal durchforsten. Da lauern für einen Anfänger ja üble Fallen, auch wenn etwas anscheinend läuft!!
Aber heute wirds mir zu spät...
Danke und gute Nacht.
Re: meine Normierungsfunktion streikt manchmal
Verfasst: Freitag 16. Juni 2017, 22:03
von BlackJack
@pyzip: Naja, das läuft ja anscheinend *nicht*.

Das läuft immer dann wenn man Werte übergibt, die alle Bedingungen erfüllen die von den Operationen erwartet werden. Und es läuft nicht wenn sie das nicht tun. Das sind ganz grundsätzliche ”Fallen”, nicht nur für Anfänger. Man kann mit statisch typisierten Programmiersprachen etwas eingrenzen was einem zur Laufzeit auf die Füsse fallen kann, allerdings dann auch zu dem Preis das man sich mehr mit festen Typen auseinandersetzen muss. Alle Fehler schliesst man damit aber auch nicht aus. Dafür gibt es Unit-Tests. Mit denen findet man auch Typfehler.
Re: meine Normierungsfunktion streikt manchmal
Verfasst: Samstag 17. Juni 2017, 20:36
von pyzip
Hallo BlackJack, nochmal vielen Dank für die schnelle Antwort! Habe mir mal intensiv die Datentypen angeschaut und noch einige Fehler in meinem Progrämmchen gefunden. Blöderweise bin ich manchmal davon ausgegangen, dass das Laden von numpy reicht, um Numpy-Arrays zu erhalten. Na ja...