multiplication vectorielle de la matrice numpy [dupliquer]

cette question a déjà une réponse ici:

  • en quoi la multiplication diffère-t-elle pour les classes de matrice de NumPy par rapport aux classes de tableaux? 7 réponses

Quand je multiplie deux numpy des tableaux de tailles (n x n)*(n x 1), j'obtiens une matrice de taille (n x n). Suivant les règles normales de multiplication matricielle, a (n x 1) le vecteur est attendu, mais je ne peux pas trouver d'informations sur la façon dont cela se fait dans le module num Python.

le truc c'est que je ne veux pas l'implémenter manuellement pour préserver la vitesse du programme.

exemple de code ci-dessous:

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

ce que je veux c'est:

print a*b
   >>
   [16 6 8]
111
demandé sur tarzanbappa 2014-02-05 00:43:59

1 réponses

solution la plus simple

utiliser numpy.dot ou a.dot(b) . Voir la documentation ici .

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

cela se produit parce que les tableaux numpy ne sont pas des matrices, et les opérations standard *, +, -, / travail élément-sage sur les tableaux. Au lieu de cela, vous pourriez essayer d'utiliser numpy.matrix , et * sera traité comme une multiplication matricielle.


Autres Solutions

aussi savoir qu'il y a d'autres options:

  • comme indiqué ci-dessous, si vous utilisez python3.5+ l'opérateur @ fonctionne comme prévu:

    >>> print(a @ b)
    array([16, 6, 8])
    
  • si vous voulez overkill, vous pouvez utiliser numpy.einsum . La documentation vous donnera une idée de comment cela fonctionne, mais honnêtement, je n'ai pas bien comprendre comment l'utiliser jusqu'à la lecture cette réponse et juste jouer avec elle sur mon propre.

    >>> np.einsum('ji,i->j', a, b)
    array([16, 6, 8])
    
  • à partir de mi-2016( numpy 1.10.1), vous pouvez essayer le expérimental numpy.matmul , qui fonctionne comme numpy.dot avec deux exceptions majeures: pas de multiplication scalaire mais il fonctionne avec des piles de matrices.

    >>> np.matmul(a, b)
    array([16, 6, 8])
    
  • numpy.inner fonctionne de la même manière que numpy.dot pour la multiplication matrice-vecteur mais se comporte différemment pour la multiplication matrice-matrice et tenseur (voir Wikipédia concernant les différences entre le produit intérieur et le produit Point en général ou voir cette réponse concernant les implémentations de num PY).

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

plus Rares options pour les cas limites

  • si vous avez des tenseurs (tableaux de dimension supérieure ou égale à un), vous pouvez utiliser numpy.tensordot avec l'argument optionnel axes=1 :

    >>> np.tensordot(a, b, axes=1)
    array([16,  6,  8])
    
  • de Ne pas utiliser numpy.vdot si vous avez une matrice de nombres complexes, comme la matrice sera aplati sur un tableau 1D, il tentera alors de trouver le produit complexe de points conjugués entre votre matrice aplatie et le vecteur (qui échouera en raison d'un décalage de taille n*m vs n ).

175
répondu wflynny 2018-01-10 18:46:30