2014-05-08 7 views
9

numpy ist der Code, den ich in Octave haben:mit @times Converting bsxfun Diese

sum(bsxfun(@times, X*Y, X), 2) 

Der bsxfun Teil des Codes erzeugt elementweise Multiplikation so dachte ich, dass numpy.multiply(X*Y, X) den Trick tun würde, aber ich habe ein Ausnahme. Bei einigen Nachforschungen habe ich festgestellt, dass die elementweise Multiplikation bei Python-Arrays nicht funktioniert (speziell wenn X und Y vom Typ "numpy.darray" sind). Also habe ich mich gefragt, ob irgendjemand das ein bisschen mehr erklären könnte - d. H. Würde Casting auf eine andere Art von Objektarbeit schreiben? Der Oktav-Code funktioniert, daher weiß ich, dass ich keinen linearen Algebra-Fehler habe. Ich nehme an, dass bsxfun und numpy.multiply nicht wirklich äquivalent sind, aber ich bin nicht sicher, warum so irgendwelche Erklärungen großartig sein würden.

konnte ich ein website finden! Das gibt Octave zu Matlab-Funktion Konvertierungen, aber es schien nicht in meinem Fall zu helfen.

+0

Diese Frage erscheint Wegthema zu sein, weil es sich um eine Anfrage für die Code-Übersetzung – jonrsharpe

+0

ist, wenn Sie gelten 'Summe()' in NumPy sind die Auswahl Ihnen, die richtige 'axis'? –

+0

"Ich habe eine Menge Ärger" ist nicht sehr informativ. Bitte beschreiben Sie das Verhalten, das Sie sehen, ein reproduzierbares Beispiel ist der beste Weg, dies zu tun. –

Antwort

10

bsxfun in Matlab für die Expansion binären Singleton stehen, in numpy es Rundfunk genannt und automatisch geschehen soll. Die Lösung hängt von den Abmessungen IhrDeterm X, also ist es ein Zeilen- oder Spaltenvektor, aber diese Antwort zeigt eine Möglichkeit, es zu tun:

How to multiply numpy 2D array with numpy 1D array?

Ich denke, dass das Problem hier ist, dass Rundfunk erfordert eine der die Abmessungen 1 und, anders als Matlab zu sein, numpy zwischen einem 1-dimensionalen 2-Element-Vektor und ein 2-dimensionalen 2 Elemente, dh den Unterschied zwischen einer Matrix der Form (2,) und der Form (2,1), müssen Sie die letztere für die Übertragung passieren zu unterscheiden scheint .

+0

Gibt es keine bxnfun in numpy? Was, wenn ich zum Beispiel eine elementare Summe machen möchte. – Pinocchio

+0

Sie tun einfach die Summe, numpy wird es automatisch entlang einer Dimension übertragen. Also nur '+' in numpy ist das gleiche wie 'bsxfun (@plus ,,) in Matlab * vorausgesetzt * Ihre numpy Dimensionen sind richtig – Dan

+0

so ist der Python-Code nur buchstäblich nur' A + B' oder 'A * B' (Angenommen, A hat Dx1 und B hat 1 x K). – Pinocchio

2

Für diejenigen, die Numpy weiß es nicht, ich glaube, es ist darauf hinzuweisen, dass das Äquivalent von Octave (und Matlab) * Operator (Matrixmultiplikation) ist numpy.dot (und strittigerweise numpy.outer). Numpy des * Operator ist ähnlich bsxfun(@times,...) in Octave, die selbst ist eine Verallgemeinerung von .*.

In Octave, wenn bsxfun Anwendung gibt es implizite Singleton Dimensionen rechts von der „wahren“ Größe der Operanden; das heißt, ein n1 x n2 x n3 Array kann als n1 x n2 x n3 x 1 x 1 x 1 x... betrachtet werden. In Numpy sind die impliziten Singleton Dimensionen nach links; so ein m1 x m2 x m3 kann als ... x 1 x 1 x m1 x m2 x m3 betrachtet werden. Dies ist wichtig, wenn Operandengrößen berücksichtigt werden: In Oktave funktioniert bsxfun(@times,a,b), wenn a 2 x 3 x 4 und b 2 x 3 ist. In Numpy konnte man nicht zwei solche Arrays multiplizieren, aber man könnte eine 2 x 3 x 4 und einen 3 x 4 Array vervielfachen.

Schließlich wird bsxfun(@times, X*Y, X) in Octave wahrscheinlich so etwas wie numpy.dot(X,Y) * X aussehen. Es gibt noch einige Fallstricke: zum Beispiel, wenn Sie ein äußeres Produkt erwar (das heißt, in Octave X ein Spaltenvektor ist, Y ein Zeilenvektor), können Sie bei Verwendung numpy.outer stattdessen aussehen könnte, oder vorsichtig sein, über die Form X und Y.