vectores una transponer tamaƱo sumar multiplicar matriz matrices libreria importar ejemplos como columnas arreglo python arrays numpy vector matrix

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 como numpy.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 que numpy.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 opcional axes=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ño n*m vs n ).