différence entre numpy (dot) et intérieure()

Quelle est la différence entre

import numpy as np
np.dot(a,b)

Et

import numpy as np
np.inner(a,b)

Tous les exemples que j'ai essayés ont renvoyé le même résultat. Wikipedia a le même article pour les deux?! Dans La description de {[2] } dit que son comportement est différent dans les dimensions supérieures, mais je ne pouvais pas produire de sortie différente. Qui dois-je utiliser?

43
demandé sur Milla Well 2012-06-14 16:59:21

5 réponses

numpy.dot:

Pour les tableaux 2-D, il est équivalent à la multiplication matricielle, et pour les tableaux 1-D au produit interne des vecteurs (sans conjugaison complexe). Pour N dimensions, c'est la somme du produit au cours de la , dernier axe et le avant-dernier de b:

numpy.inner:

Produit interne ordinaire des vecteurs pour les tableaux 1-D (sans conjugaison complexe), en dimensions supérieures un produit de somme sur le dernier axes .

(soulignement du mien.)

À titre d'exemple, considérons cet exemple avec des tableaux 2D:

>>> a=np.array([[1,2],[3,4]])
>>> b=np.array([[11,12],[13,14]])
>>> np.dot(a,b)
array([[37, 40],
       [85, 92]])
>>> np.inner(a,b)
array([[35, 41],
       [81, 95]])

Ainsi, celui que vous devez utiliser est celui qui donne le bon comportement pour votre application.


Des tests de Performance

(notez que je ne teste que le cas 1D, car c'est la seule situation où .dot et .inner donnent le même résultat.)

>>> import timeit
>>> setup = 'import numpy as np; a=np.random.random(1000); b = np.random.random(1000)'

>>> [timeit.timeit('np.dot(a,b)',setup,number=1000000) for _ in range(3)]
[2.6920320987701416, 2.676928997039795, 2.633111000061035]

>>> [timeit.timeit('np.inner(a,b)',setup,number=1000000) for _ in range(3)]
[2.588860034942627, 2.5845699310302734, 2.6556360721588135]

Alors peut-être que .inner est plus rapide, mais ma machine est assez chargée au moment, de sorte que les timings ne sont pas cohérents et ne sont pas nécessairement très précis.

48
répondu huon 2012-06-15 12:01:36

np.dot et np.inner sont identiques pour les tableaux 1-dimensions, c'est probablement pourquoi vous ne remarquez aucune différence. Pour les tableaux à n Dimensions, ils correspondent à des opérations tensorielles communes.

np.inner est parfois appelé un "produit vectoriel" entre un tenseur d'ordre supérieur et inférieur, en particulier un tenseur fois un vecteur, et conduit souvent à une "contraction du tenseur". Il comprend la multiplication matricielle-vectorielle.

np.dot correspond à un "produit tenseur", et inclut le cas mentionné à le bas de la page de Wikipedia. Il est généralement utilisé pour la multiplication de deux tenseurs de produire un nouveau tenseur. Il comprend la multiplication matrice-matrice.

Si vous n'utilisez pas de tenseurs, vous n'avez pas à vous soucier de ces cas et ils se comportent de manière identique.

13
répondu marshall.ward 2012-06-20 02:41:10

Pour les tableaux 1 et 2 dimensions numpy.inner fonctionne comme transposer la deuxième matrice puis multiplier. Donc pour:

A = [[a1,b1],[c1,d1]]
B = [[a2,b2],[c2,d2]]
numpy.inner(A,B)
array([[a1*a2 + b1*b2, a1*c2 + b1*d2],
       [c1*a2 + d1*b2, c1*c2 + d1*d2])

J'ai travaillé ceci en utilisant des exemples comme:

A=[[1  ,10], [100,1000]]
B=[[1,2], [3,4]]
numpy.inner(A,B)
array([[  21,   43],
       [2100, 4300]])

Cela explique également le comportement dans une dimension, numpy.inner([a,b],[c,b]) = ac+bd et numpy.inner([[a],[b]], [[c],[d]]) = [[ac,ad],[bc,bd]]. C'est la mesure de mes connaissances, aucune idée de ce qu'il fait pour les dimensions supérieures.

5
répondu Rob McKemey 2014-09-26 11:06:13

Inner ne fonctionne pas correctement avec des tableaux 2D complexes, essayez de multiplier

Et sa transposition

array([[ 1.+1.j,  4.+4.j,  7.+7.j],
       [ 2.+2.j,  5.+5.j,  8.+8.j],
       [ 3.+3.j,  6.+6.j,  9.+9.j]])

Vous obtiendrez

array([[ 0. +60.j,  0. +72.j,  0. +84.j],
       [ 0.+132.j,  0.+162.j,  0.+192.j],
       [ 0.+204.j,  0.+252.j,  0.+300.j]])

Multiplier efficacement les lignes en lignes plutôt que les lignes en colonnes

1
répondu Himanshu 2014-07-22 10:18:12

Il y a beaucoup de différence entre le produit intérieur et le produit de point dans l'espace dimensionnel supérieur. voici un exemple d'une matrice 2x2 et d'une matrice 3x2 x = [[a1,b1],[c1,d1]] y= [[a2, b2].[c2,d2],[e2,f2]

Np.intérieur (x,y)

Sortie = [[a1xa2 + b1xb2, a1xc2 + b1xd2, a1xe2 + b1f2], [c1xa2+d1xb2, c1xc2+d1xd2, c1xe2+d1xf2]]

Mais dans le cas du produit dot, la sortie affiche l'erreur ci-dessous car vous ne pouvez pas multiplier une matrice 2x2 avec un 3x2.

ValueError: formes (2,2) et (3,2) non aligné: 2 (dim 1) != 3 (dim 0)

-1
répondu pylearner 2017-11-08 06:12:22