In numpy habe ich zwei "Arrays", X
ist (m,n)
und y
ist ein Vektor(n,1)
mit
X*y
Ich erhalte den Fehler
ValueError: operands could not be broadcast together with shapes (97,2) (2,1)
Wann (97,2)x(2,1)
ist eindeutig eine legale Matrixoperation und sollte mir einen (97,1)
Vektor geben
BEARBEITEN:
Ich habe dies mit korrigiert, X.dot(y)
aber die ursprüngliche Frage bleibt noch.
X*y
sollte nicht funktionieren (und es funktioniert nicht), abernp.dot(X,y)
undX.dot(y))
sollte funktionieren (und für mich tun sie es).*
ist keine Matrixmultiplikation fürndarray
Objekte.Antworten:
dot
ist Matrixmultiplikation, macht aber*
noch etwas anderes.Wir haben zwei Arrays:
X
, Form (97,2)y
, Form (2,1)Mit Numpy-Arrays die Operation
wird elementweise ausgeführt, aber einer oder beide Werte können in einer oder mehreren Dimensionen erweitert werden, um sie kompatibel zu machen. Diese Operation wird als Rundfunk bezeichnet. Dimensionen, bei denen die Größe 1 ist oder die fehlen, können für die Übertragung verwendet werden.
Im obigen Beispiel sind die Abmessungen nicht kompatibel, weil:
Hier gibt es widersprüchliche Zahlen in der ersten Dimension (97 und 2). Darüber beschwert sich der oben genannte ValueError. Die zweite Dimension wäre in Ordnung, da Nummer 1 mit nichts in Konflikt steht.
Weitere Informationen zu den Übertragungsregeln finden Sie unter: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
(Bitte beachten Sie, dass wenn
X
undy
vom Typ sindnumpy.matrix
, ein Sternchen als Matrixmultiplikation verwendet werden kann. Meine Empfehlung ist, sich davon fernzuhaltennumpy.matrix
, da dies die Dinge eher kompliziert als vereinfacht.)Ihre Arrays sollten in Ordnung sein mit
numpy.dot
; Wenn Sie eine Fehlermeldung erhaltennumpy.dot
, müssen Sie einen anderen Fehler haben. Wenn die Formen falsch sindnumpy.dot
, erhalten Sie eine andere Ausnahme:Wenn dieser Fehler weiterhin auftritt, geben Sie bitte ein minimales Beispiel für das Problem an. Eine beispielhafte Multiplikation mit Arrays in Ihrer Form ist erfolgreich:
quelle
Pro numpy docs :
Mit anderen Worten, wenn Sie versuchen, zwei Matrizen (im Sinne der linearen Algebra) zu multiplizieren, möchten Sie,
X.dot(y)
aber wenn Sie versuchen, Skalare von der Matrixy
auf die Matrix zu übertragenX
, müssen Sie eine Leistung erbringenX * y.T
.Beispiel:
quelle
Es ist möglich, dass der Fehler nicht im Punktprodukt aufgetreten ist, sondern danach. Versuchen Sie dies zum Beispiel
np.dot (a, b) wird in Ordnung sein; np.dot (a, b) * c ist jedoch eindeutig falsch (12x1 x 1x5 = 12x5, was nicht elementweise 5x12 multiplizieren kann), aber numpy gibt Ihnen
Der Fehler ist irreführend; Es gibt jedoch ein Problem in dieser Zeile.
quelle
Verwenden Sie
np.mat(x) * np.mat(y)
, das wird funktionieren.quelle
Sie suchen
np.matmul(X, y)
. In Python 3.5+ können Sie verwendenX @ y
.quelle
Wir könnten uns verwirren, dass a * b ein Punktprodukt ist.
Tatsächlich wird es jedoch ausgestrahlt.
Punktprodukt : a.dot (b)
Übertragung:
(m, n) + - / * (1, n) → (m, n): Die Operation wird auf m Zeilen angewendet
quelle