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]
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 commenumpy.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 quenumpy.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 optionnelaxes=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 taillen*m
vsn
).