Gemäß den documentation:`np.dot` ohne kartesisches Produkt auf verbleibenden Achsen
Für N Dimensionen
dot
ist eine Summe Produkt in der letzten Achse dera
und die zweiten bis letzten derb
:dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
ich mag die Summe Produkt in der letzten Achse der a
und die zweiten bis letzt der b
berechnen, aber ohne das kartesische Produkt über die Form verbleibende Achsen, da die übrigen Achsen die gleiche Form haben. Lassen Sie mich mit einem Beispiel illustrieren:
a = np.random.normal(size=(11, 12, 13))
b = np.random.normal(size=(11, 12, 13, 13))
c = np.dot(a, b)
c.shape # = (11, 12, 11, 12, 13)
Aber ich würde die Form wie (11, 12, 13)
zu sein. Der gewünschte Effekt kann mit
c = np.sum(a[..., None] * b, axis=-2)
c.shape # = (11, 12, 13)
Aber meine Anordnungen sind relativ groß und ich möchte die Macht der parallelisierten BLAS-Implementierungen verwendet werden, die nicht angezeigt durch np.sum
unterstützt werden, sondern werden von np.dot
unterstützt. Irgendwelche Ideen, wie man das erreicht?
Ich mag 'einsum' wirklich, aber es funktioniert nicht parallel mit BLAS. –
@TillHoffmann Nun, AFAIK, dot-basierte Funktionen wie 'np.dot' und' np.tensordot', die 'blas' verwenden, erlauben keine ausgerichteten Achsen, wie bei'Einsum' halten wir hier die ersten beiden Achsen zwischen' a' und 'b'. Auf der Leistung, für die Beispieldatengrößen, erweist sich dieser'Einsum'-Ansatz als '4x +' besser :) – Divakar
Großartig, danke für die Klarstellung. Für jeden, der daran interessiert ist, ist np.einsum ('... i, ... ij -> ... j', a, b) 'agnostisch für die Dimensionalität. –