webentwicklung-frage-antwort-db.com.de

unterschied zwischen numpy dot () und inner ()

Was ist der Unterschied zwischen

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

und

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

alle Beispiele, die ich ausprobierte, lieferten das gleiche Ergebnis. Wikipedia hat den gleichen Artikel für beide ?! In der Beschreibung von inner() heißt es, dass sich das Verhalten in höheren Dimensionen unterscheidet, aber ich konnte keine andere Ausgabe erzeugen. Welches sollte ich verwenden? 

46
Milla Well

numpy.dot :

Bei 2-D-Arrays entspricht dies der Matrixmultiplikation und bei 1-D-Arrays dem inneren Produkt von Vektoren (ohne komplexe Konjugation). Für N-Dimensionen ist es ein Summenprodukt über der letzten Achse von a und dem vorletzten von b:

numpy.inner :

Gewöhnliches inneres Produkt von Vektoren für 1-D-Arrays (ohne komplexe Konjugation), in höheren Dimensionen ein Summenprodukt über der letzten Achse.

(Betonung mein.)

Betrachten Sie dieses Beispiel als Beispiel mit 2D-Arrays:

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

Daher sollten Sie diejenige verwenden, die das richtige Verhalten für Ihre Anwendung ergibt.


Leistungstest

(Beachten Sie, dass ich nur den 1D-Fall teste, da dies die einzige Situation ist, in der .dot und .inner dasselbe Ergebnis liefern.)

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

Vielleicht ist .inner schneller, aber meine Maschine ist momentan ziemlich ausgelastet, daher sind die Timings nicht einheitlich und nicht unbedingt sehr genau.

51
huon

np.dot und np.inner sind für Arrays mit 1 Dimensionen identisch. Daher bemerken Sie wahrscheinlich keine Unterschiede. Bei Arrays mit N-Dimension entsprechen sie üblichen Tensoroperationen.

np.inner wird manchmal als "Vektorprodukt" zwischen einem Tensor höherer und niedrigerer Ordnung, insbesondere einem Tensor mal einem Vektor, bezeichnet und führt häufig zu einer "Tensorkontraktion". Es beinhaltet Matrix-Vektor-Multiplikation.

np.dot entspricht einem "Tensorprodukt" und schließt den Fall ein, der unten auf der Wikipedia-Seite erwähnt wird. Es wird im Allgemeinen für die Multiplikation von zwei ähnlichen Tensoren verwendet, um einen neuen Tensor herzustellen. Es beinhaltet Matrix-Matrix-Multiplikation.

Wenn Sie keine Tensoren verwenden, müssen Sie sich nicht um diese Fälle kümmern und sie verhalten sich identisch.

14
marshall.ward

Bei 1- und 2-dimensionalen Arrays arbeitet numpy.inner als transponierte zweite Matrix und multipliziert dann .

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

Ich habe das anhand von Beispielen erarbeitet:

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

Dies erklärt auch das Verhalten in einer Dimension, numpy.inner([a,b],[c,b]) = ac+bd und numpy.inner([[a],[b]], [[c],[d]]) = [[ac,ad],[bc,bd]]. Dies ist der Umfang meines Wissens, keine Ahnung, was es für höhere Dimensionen tut.

5
Rob McKemey

inner funktioniert nicht richtig mit komplexen 2D-Arrays. Versuchen Sie, sich zu vermehren

und seine transponieren

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

sie erhalten

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

die Zeilen effektiv in Zeilen und nicht in Zeilen in Spalten multiplizieren

1
Himanshu

Es gibt einen großen Unterschied zwischen Innenprodukt und Punktprodukt im höherdimensionalen Raum. unten ist ein Beispiel einer 2x2-Matrix und einer 3x2-Matrix x = [[a1, b1], [c1, d1]] y = [[a2, b2]. [c2, d2], [e2, f2]

np.inner (x, y) 

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

Bei Punktprodukten zeigt die Ausgabe jedoch den folgenden Fehler an, da Sie eine 2x2-Matrix nicht mit einer 3x2-Matrix multiplizieren können.

ValueError: Shapes (2,2) und (3,2) nicht ausgerichtet: 2 (Dim 1)! = 3 (Dim 0)

0
pylearner