En numpy, tengo dos "matrices", Xes (m,n)y yes 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*yNo 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 parandarrayobjetos.Respuestas:
dotes 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
Xyyson 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 matrizyaXcontinuació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