En numpy, tengo dos "matrices", X
es (m,n)
y y
es un vector(n,1)
utilizando
X*y
Estoy recibiendo el error
ValueError: operands could not be broadcast together with shapes (97,2) (2,1)
Cuando (97,2)x(2,1)
es claramente una operación de matriz legal y debería darme un (97,1)
vector
EDITAR:
He corregido esto usando X.dot(y)
pero la pregunta original aún permanece.
X*y
No debería funcionar (y no lo hace), peronp.dot(X,y)
, yX.dot(y))
debería funcionar (y para mí que hacer).*
no es la multiplicación de matrices parandarray
objetos.Respuestas:
dot
es la multiplicación de matrices, pero*
hace algo más.Tenemos dos matrices:
X
, forma (97,2)y
, forma (2,1)Con matrices Numpy, la operación
se realiza por elementos, pero uno o ambos valores se pueden expandir en una o más dimensiones para hacerlos compatibles. Esta operación se llama radiodifusión. Las dimensiones en las que el tamaño es 1 o las que faltan se pueden utilizar en la radiodifusión.
En el ejemplo anterior, las dimensiones son incompatibles porque:
Aquí hay números en conflicto en la primera dimensión (97 y 2). Eso es de lo que se queja el ValueError anterior. La segunda dimensión estaría bien, ya que el número 1 no entra en conflicto con nada.
Para obtener más información sobre las reglas de transmisión: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
(Tenga en cuenta que si
X
yy
son de tiponumpy.matrix
, entonces el asterisco se puede usar como multiplicación de matrices. Mi recomendación es evitarnumpy.matrix
, tiende a complicar más que simplificar las cosas).Tus matrices deberían estar bien
numpy.dot
; si obtiene un errornumpy.dot
, debe tener algún otro error. Si las formas son incorrectasnumpy.dot
, obtienes una excepción diferente:Si aún recibe este error, publique un ejemplo mínimo del problema. Un ejemplo de multiplicación con matrices con la forma de la suya tiene éxito:
fuente
Por documentos numpy :
En otras palabras, si usted está tratando de multiplicar dos matrices (en el sentido de álgebra lineal), entonces usted quiere
X.dot(y)
, pero si usted está tratando de escalares de difusión desde la matrizy
aX
continuación, es necesario realizarX * y.T
.Ejemplo:
fuente
Es posible que el error no se haya producido en el producto escalar, sino después. Por ejemplo, prueba esto
np.dot (a, b) estará bien; sin embargo, np.dot (a, b) * c es claramente incorrecto (12x1 X 1x5 = 12x5 que no se puede multiplicar por elementos 5x12) pero numpy te dará
El error es engañoso; sin embargo, hay un problema en esa línea.
fuente
Use
np.mat(x) * np.mat(y)
, eso funcionará.fuente
Que busca
np.matmul(X, y)
. En Python 3.5+ puede usarX @ y
.fuente
Podríamos confundirnos con que a * b es un producto escalar.
Pero, de hecho, se transmite.
Producto escalar : a.dot (b)
Transmitir:
(m, n) + - / * (1, n) → (m, n): la operación se aplicará a m filas
fuente