una - transponer matriz python
numpy multiplicaciĆ³n vectorial de matriz (1)
Esta pregunta ya tiene una respuesta aquí:
Cuando multiplico dos matrices numpy de tamaños (nxn) * (nx 1), obtengo una matriz de tamaño (nxn). Siguiendo las reglas de multiplicación de matrices normales, se espera un vector (nx 1), pero simplemente no puedo encontrar ninguna información sobre cómo se hace esto en el módulo Numpy de Python.
La cuestión es que no quiero implementarlo manualmente para preservar la velocidad del programa.
El código de ejemplo se muestra a continuación:
a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
b = np.array([1, 2, 3])
print a*b
>>
[[5 2 9]
[1 2 3]
[1 4 3]]
Lo que quiero es:
print a*b
>>
[16 6 8]
La solución más simple
Use numpy.dot
o a.dot(b)
. Vea la documentación here .
>>> a = np.array([[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]])
>>> b = np.array([1, 2, 3])
>>> print a.dot(b)
array([16, 6, 8])
Esto ocurre porque las matrices numpy no son matrices, y las operaciones estándar *, +, -, /
work-element-wise en las matrices. En cambio, podría intentar usar numpy.matrix
, y *
se tratará como una multiplicación de matriz.
Otras soluciones
También sabe que hay otras opciones:
Como se indica a continuación, si usa python3.5 + el operador
@
funciona como es de esperar:>>> print(a @ b) array([16, 6, 8])
Si quieres overkill, puedes usar
numpy.einsum
. La documentación te dará una idea de cómo funciona, pero sinceramente, no entendí completamente cómo usarlo hasta que leí esta respuesta y solo jugué por mi cuenta.>>> np.einsum(''ji,i->j'', a, b) array([16, 6, 8])
A partir de mediados de 2016 (numpy 1.10.1), puedes probar el
numpy.matmul
experimental, que funciona comonumpy.dot
con dos excepciones principales: sin multiplicación escalar, pero funciona con pilas de matrices.>>> np.matmul(a, b) array([16, 6, 8])
numpy.inner
funciona de la misma manera quenumpy.dot
para la multiplicación matriz-vector, pero se comporta de forma diferente para matriz-matriz y multiplicación de tensor (ver Wikipedia sobre las diferencias entre el producto interno y el producto escalar en general o ver esta respuesta SO sobre las implementaciones de numpy) .>>> np.inner(a, b) array([16, 6, 8]) # Beware using for matrix-matrix multiplication though! >>> b = a.T >>> np.dot(a, b) array([[35, 9, 10], [ 9, 3, 4], [10, 4, 6]]) >>> np.inner(a, b) array([[29, 12, 19], [ 7, 4, 5], [ 8, 5, 6]])
Opciones más raras para casos extremos
Si tiene tensores (matrices de dimensión mayor o igual a uno), puede usar
numpy.tensordot
con el argumento opcionalaxes=1
:>>> np.tensordot(a, b, axes=1) array([16, 6, 8])
No use
numpy.vdot
si tiene una matriz de números complejos, ya que la matriz se aplanará en una matriz 1D, entonces tratará de encontrar el producto complejo de puntos conjugados entre su matriz aplanada y el vector (que fallará debido a un desajuste de tamañon*m
vsn
).