python numpy ValueError: Operanden konnten nicht zusammen mit Shapes gesendet werden

124

In numpy habe ich zwei "Arrays", Xist (m,n)und yist 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.

yayu
quelle
2
Was ist die "ursprüngliche Frage"? X*ysollte nicht funktionieren (und es funktioniert nicht), aber np.dot(X,y)und X.dot(y))sollte funktionieren (und für mich tun sie es).
DSM
3
*ist keine Matrixmultiplikation für ndarrayObjekte.
user2357112 unterstützt Monica
Ich bin beim Lösen von wT * X auf dasselbe Problem gestoßen, wenn dies np.dot (wT, X) sein sollte
Juan Zamora
X * y macht elementweise Multiplikation
Victor Zuanazzi

Antworten:

91

dotist Matrixmultiplikation, macht aber *noch etwas anderes.

Wir haben zwei Arrays:

  • X, Form (97,2)
  • y, Form (2,1)

Mit Numpy-Arrays die Operation

X * y

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:

97   2
 2   1

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 Xund yvom Typ sind numpy.matrix, ein Sternchen als Matrixmultiplikation verwendet werden kann. Meine Empfehlung ist, sich davon fernzuhalten numpy.matrix, da dies die Dinge eher kompliziert als vereinfacht.)

Ihre Arrays sollten in Ordnung sein mit numpy.dot; Wenn Sie eine Fehlermeldung erhalten numpy.dot, müssen Sie einen anderen Fehler haben. Wenn die Formen falsch sind numpy.dot, erhalten Sie eine andere Ausnahme:

ValueError: matrices are not aligned

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:

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
DrV
quelle
34

Pro numpy docs :

Bei der Arbeit mit zwei Arrays vergleicht NumPy ihre Formen elementweise. Es beginnt mit den nachfolgenden Dimensionen und arbeitet sich vorwärts. Zwei Dimensionen sind kompatibel, wenn:

  • sie sind gleich oder
  • einer von ihnen ist 1

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 Matrix yauf die Matrix zu übertragen X, müssen Sie eine Leistung erbringen X * y.T.

Beispiel:

>>> import numpy as np
>>>
>>> X = np.arange(8).reshape(4, 2)
>>> y = np.arange(2).reshape(1, 2)  # create a 1x2 matrix
>>> X * y
array([[0,1],
       [0,3],
       [0,5],
       [0,7]])
Gobrewers14
quelle
11

Es ist möglich, dass der Fehler nicht im Punktprodukt aufgetreten ist, sondern danach. Versuchen Sie dies zum Beispiel

a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c

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

ValueError: operands could not be broadcast together with shapes (12,1) (1,5)

Der Fehler ist irreführend; Es gibt jedoch ein Problem in dieser Zeile.

Kenan
quelle
1
Die Fehlermeldung ist in der Tat irreführend, da dies zu erscheinen scheint, wenn Ihre Matrixdimensionen für die elementweise Multiplikation falsch sind.
Aung Htet
7

Verwenden Sie np.mat(x) * np.mat(y), das wird funktionieren.

user3101695
quelle
7

Sie suchen np.matmul(X, y). In Python 3.5+ können Sie verwenden X @ y.

iamanigeeit
quelle
0

Wir könnten uns verwirren, dass a * b ein Punktprodukt ist.

Tatsächlich wird es jedoch ausgestrahlt.

Punktprodukt : a.dot (b)

Übertragung:

Der Begriff Broadcasting bezieht sich darauf, wie Numpy Arrays mit unterschiedlichen Dimensionen während arithmetischer Operationen behandelt, die zu bestimmten Einschränkungen führen. Das kleinere Array wird über das größere Array gesendet, so dass sie kompatible Formen haben.

(m, n) + - / * (1, n) → (m, n): Die Operation wird auf m Zeilen angewendet

Chia Yongkang
quelle