lange Zeit Leser, erstmals Schriftsteller.
Ich suchte auf Google und Stack-Überlauf, aber war nicht wirklich in der Lage, eine allgemeine Antwort auf diese Frage zu finden.
Ich bekomme einen "nicht unterstützten Operandentyp (en) für *:" numpy.darray "und" numpy.float64 "" Fehler in Python 2.7.3 mit numpy 1.6.2.
Der Fehler kommt von der Multiplikation eines numpy Arrays und eines numpy float, aber es passiert nicht jedes Mal.
Zum Beispiel:
%Vor%Oder
%Vor%Beide funktionieren
Jetzt für das Problem Kinder:
%Vor%oder, mit x wie oben definiert:
%Vor%beide erzeugen den Fehler: NotImplemented
Ich weiß, dass die Zufallsfunktionen und Zahlen seltsam erscheinen, aber konzeptionell sollte das immer noch funktionieren, da es funktionierte, wenn beide einzeln auf Variablen gesetzt wurden.
Warum passiert das? Wie kann ich es in einem allgemeinen Sinne beheben?
Vielen Dank! Jason
Ich vermute, dass das Problem hier ist, dass NumPy Python long
-Werte nicht in seinen Arrays speichern kann. Sobald Sie dies versuchen, wird der Datentyp des Arrays in object
geändert. Arithmetische Operationen auf dem Array werden dann schwieriger, weil NumPy die Arithmetik selbst nicht mehr ausführen kann.
Seltsamerweise kann manchmal die Reihenfolge der Argumente vertauscht werden:
%Vor% In diesem zweiten Fall ist der Typ des Ergebnisses ein Python float
, kein NumPy-Array.
Die Fehlerbehebung besteht darin, das Erstellen von long
-Werten in NumPy-Arrays zu vermeiden und stattdessen float
s zu verwenden:
Wenn Sie einen Fehler erhalten, wie dies in der Zukunft der Fall ist, überprüfen Sie als Erstes dtype
des zu multiplizierenden Arrays. Enthält es NumPy-Werte oder Python-Objekte?
Ist das ein Quiz? Ich verstehe nicht, warum die Frage so verschleiert ist ... Alles läuft auf diese einfache Tatsache hinaus.
Gegeben
%Vor%wir haben
%Vor% Dies ist der Fehler (oder Funktion, ich weiß es nicht) da es y.__mul__(x) == y.__rmul__(x)
sein sollte (zumindest für diese speziellen Werte von x
und y
).
Python long
kann nicht mit der Multiplikation mit numpy.float64
umgehen (aber das ist korrekt.)
Also y*x
ergibt y.__mul__(x)
und gibt das erwartete Ergebnis. Im Gegensatz dazu wird x*y
zuerst als x.__mul__(y)
(nicht implementiert, OK) als y.__rmul__(x)
versucht (nicht implementiert, aber ein Fehler).
Wie bereits erwähnt, können wir nd.arrays
von beliebigen Objekten haben, und alles wird klar.
Bearbeiten
Dieser Fehler wurde korrigiert (wahrscheinlich in numply ver. 1.7):
%Vor%