[python] function / broadcasting problem

M

MIkeo-l-e-

Aktives Mitglied
Thread Starter
Dabei seit
26.12.2007
Beiträge
181
Reaktionspunkte
20
Hallo Macuser,
ich kämpfe zur Zeit mit einem kleinem Python Problem und hab jetzt mal ein kleines Beispiel zusammengestellt.

Code:
import numpy as np

x_data = [1, 2, 3, 4, 5, 6, 7]

def my_func(x):
   return np.sin(x) + np.sin(2*x)

y_data = my_func(x_data)

Ich erhalte dann folgende Fehlermeldung:

Code:
Traceback (most recent call last):
  File "fit_3.py", line 11, in <module>
    data_first_guess = my_func(x_data)
  File "fit_3.py", line 8, in my_func
    return np.sin(x) + np.sin(2*x)
ValueError: operands could not be broadcast together with shapes (7) (14)

Ich verstehe die Fehlermeldung überhaupt nicht. Ich wäre für jeden Tipp dankbar!

Viele Grüße!
 
Also ums kurz zu machen, die Fehlermeldung besagt, dass ein Operator nicht angewendet werden kann, weil eine Datenstruktur die Größe 7 und eine andere die Größe 14 hat. Schauen wir uns das ganze mal an:

Code:
import numpy as np

x_data = [1, 2, 3, 4, 5, 6, 7]

def my_func(x):
   return np.sin(x) + np.sin(2*x)

print (2*x_data)

#y_data = my_func(x_data)

y_data = map(my_func,x_data)

x_data_array = np.array(x_data)

print (2*x_data_array)

y_data_array = my_func(x_data_array)

print y_data

print y_data_array

„2*x_data“ bewirkt leider nicht, dass die Einträge in der Liste verdoppelt werden, sondern dass eine Liste erzeugt, die zweimal die Einträge von „x_data“ enthält. Die Sinus-Funktion wird auf alle Listeneinträge angewendet und danach soll eine Liste der Länge 7 und eine Liste der Länge 14 addiert werden, was nicht definiert ist, daher der Fehler.

Der Rest sind Korrekturvorschläge von mir. Du könntest natürlich eine leere Liste hernehmen, dann in einer for-Schleife über die Liste iterieren, deine Funktion auf die Listenelemente anwenden und das Ergebnis in die angelegte Liste schreiben. Oder man verwendet wie hier die map-Funktion, die das erledigt. Alternativ kann man deine Liste auch in ein numpy-array konvertieren, dort wird „2*x_data_array“ wie von dir gedacht interpretiert.
 
  • Gefällt mir
Reaktionen: MIkeo-l-e-
Danke euch beiden für die Antwort!

Haskelltier hat es recht gut erklärt. Ich habe es schlussendlich so gelöst, das ich die Liste mit numpy.asarray() in ein array umgewandelt habe.
 
Zurück
Oben Unten