2014-07-03 7 views
48

In numpy ausgestrahlt zusammen werden könnten, ich habe zwei "arrays", X (m, n) und y ein Vektor (n, 1)Python numpy Valueerror: Operanden nicht mit Formen

Verwendung

X*y 

ich erhalte den Fehler

ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 

Wenn (97,2) x (2,1) ist eindeutig eine rechtliche Operationsmatrix und sollte gib mir ein (97,1) Vektor

EDIT:

Ich habe dies mit X.dot(y) korrigiert, aber die ursprüngliche Frage bleibt noch.

+0

Was ist die "ursprüngliche Frage"? 'X * y' sollte nicht funktionieren (und es nicht), aber' np.dot (X, y) 'und' X.dot (y)) 'sollte funktionieren (und für mich tun sie das). – DSM

+2

'*' ist keine Matrixmultiplikation für 'ndarray' Objekte. – user2357112

Antwort

36

dot ist Matrixmultiplikation, aber * macht etwas anderes.

Wir haben zwei Arrays:

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

Mit Numpy Arrays, die Operation

X * y 

ist elementweise getan, aber einer oder beide Werte können in einem oder beiden erweitert werden mehr Dimensionen, um sie kompatibel zu machen. Dieser Vorgang wird als Broadcasting bezeichnet. Dimensionen, bei denen die Größe 1 ist oder die fehlen, können im Rundfunk verwendet werden.

In dem obigen Beispiel den Abmessungen sind nicht kompatibel, weil:

97 2 
2 1 

Hier gibt widersprüchlichen Zahlen in der ersten Dimension sind (97 und 2). Darüber beklagt sich der oben genannte ValueError. Die zweite Dimension wäre in Ordnung, da Nummer 1 nicht mit irgendetwas kollidiert.

Weitere Informationen über Rundfunk Regeln. http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Bitte beachten Sie, dass, wenn X und y vom Typ sind numpy.matrix, dann können Sternchen als Matrixmultiplikation verwendet werden Meine Empfehlung weg von numpy.matrix zu halten ist, es neigt dazu, komplizieren mehr als Dinge zu vereinfachen.)

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

ValueError: matrices are not aligned 

Wenn Sie immer noch diese Fehlermeldung erhalten, schreiben Sie bitte ein minimales Beispiel für das Problem.Ein Beispiel Multiplikation mit Arrays wie das Ihre geformt gelingt:

In [1]: import numpy 

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

Per Wes McKinney Python for Data Analysis

The Broadcasting Rule: Two arrays are compatable for broadcasting if for each trailing dimension (that is, starting from the end), the axis lengths match or if either of the lengths is 1. Broadcasting is then performed over the missing and/or length 1 dimensions.

Mit anderen Worten, wenn Sie versuchen, zwei Matrizen (in dem linearen Algebra Sinne) zu multiplizieren, dann Sie wollen X.dot(y), aber wenn Sie versuchen, Skalare von Matrix y auf X zu übertragen, dann müssen Sie X * y.T durchführen.

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]]) 
2

Es ist möglich, dass der Fehler nicht in dem Punkt nicht auftritt, aber nach. Zum Beispiel versuchen, diesen

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; jedoch np.dot (a, b) * c eindeutig falsch ist (12x5 X 5x5 = 12x5, die nicht elementweise mehrfach 5x12), aber numpy geben 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.

Verwandte Themen