2017-06-17 4 views
0

Ich habe einen Tensor A in numpy, der ist N1 x .. x Nn x M1 x ... x Mm und ein Tensor B, die M1 x ... x Mm ist. Wie berechnen wir die Kontraktion Tensor C von A und B, die N1 x ... x Nn? sein soll ich versuchte mit ihm verschiedenen Permutationen vonWie berechnet man diese Tensorkontraktion in numpiger?

np.tensordot(A, B, ...) 

Aber ich bin nicht wirklich vertraut machen.

Ein Beispiel wenn A eine -vector N x M Matrix und B ein M war, konnte ich nur np.dot(A, B), aber ich bin nicht sicher, wie dies zu verallgemeinern.

+0

Für volle Flexibilität und Energie konnten Sie versuchen, ['numpy.einsum'] zu verwenden (https://docs.scipy.org/doc/numpy/reference/ generierte/numpy.einsum.html). – Evert

Antwort

1
In [78]: A=np.arange(2*3*4*5).reshape(2,3,4,5) 
In [79]: B=np.arange(4*5).reshape(4,5) 

In [81]: np.einsum('...ij,ij',A,B) 
Out[81]: 
array([[ 2470, 6270, 10070], 
     [13870, 17670, 21470]]) 

In [82]: np.tensordot(A,B,((2,3),(0,1))) 
Out[82]: 
array([[ 2470, 6270, 10070], 
     [13870, 17670, 21470]]) 

tensordot umformen verwendet (und Achse swap) um das Problem zu reduzieren bis 2d, dass dot handhaben kann:

In [83]: A1=A.reshape(2*3,4*5) 
In [84]: B1=B.reshape(4*5) 
In [85]: C1=np.dot(A1,B1) 
In [86]: C1.reshape(2,3) 
Out[86]: 
array([[ 2470, 6270, 10070], 
     [13870, 17670, 21470]]) 

Wenn Gesamtabmessungen und damit Größe Array zu groß ist, wird einsum Gedächtnisprobleme haben . Nun, beides kann.

Während ... die variable Anzahl von N Dimensionen handhaben kann, müssen wir speziell über die M Dimensionen sein. (Wir könnten theoretisch eine ij Zeichenkette programmatisch konstruieren.)

+0

Wie haben Sie herausgefunden, dass Sie die Tensorkontraktion durch Umformen in Matrixmultiplikation umwandeln können? Ich habe Probleme, die Antwort zu googeln. – michaelsnowden

+0

'Tensor contraction' ist keine allgemeine Beschreibung davon in numpy. Eine Websuche würde also nicht helfen. Ich habe an Ihrem Beispiel und Ihren Dimensionen gearbeitet - und mit'Einsum' experimentiert. – hpaulj