meine Normierungsfunktion streikt manchmal

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.
Antworten
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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
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.
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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.
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'
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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.
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.
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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...
Antworten