Trzeba tylko wykonać operację na pierwszym wymiarem swoimi tensorów, która jest oznaczona przez 0
:
c = tensordot(a, b, axes=(0,0))
To zadziała, jak chcesz. Również nie potrzebujesz listy osi, ponieważ jest to tylko jeden wymiar, w którym wykonujesz operację. Dzięki axes([1,2],[2,1])
krzyżujesz pomnożenie 2. i 3. wymiaru. Jeśli napiszesz to w notacji indeksu (konwencja podsumowująca Einsteina), odpowiada to c[i,j] = a[i,k,l]*b[j,k,l]
, więc zamawiasz indeksy, które chcesz zachować.
EDYCJA: Ok, problemem jest to, że tensorowy produkt z dwóch obiektów 3d to obiekt 6d. Ponieważ skurcze obejmują pary indeksów, nie ma możliwości, aby uzyskać obiekt 3D przez operację tensordot
. Sztuczka polega na podzieleniu obliczeń na dwie części: najpierw wykonujesz tensordot
na indeksie, aby wykonać operację macierzy, a następnie wykonujesz przekątną tensora, aby zredukować swój obiekt 4d do 3d. W jednym poleceniem:
d = np.diagonal(np.tensordot(a,b,axes=()), axis1=0, axis2=2)
w notacji tensora d[i,j,k] = c[i,j,i,k] = a[i,j,l]*b[i,l,k]
.
Dzięki Divakar. Chciałabym móc to wykorzystać, ale utknąłem na starej wersji numpy, która nie ma einsum. Czy istnieje odpowiednik równy tensordotowi? – Remy
Nigdy nie mogłem zrozumieć, jak działa 'einsum'. Czy jest coś, o czym czytasz, które nauczyło cię, jak działa składnia? – rayryeng
@rayryeng Tylko oficjalne dokumenty i godziny grania z nim. Jest jeszcze wiele innych rzeczy, które widziałem, jak ludzie robią to na SO, że muszę się dowiedzieć! Po prostu baw się z nim, tak jak zrobiłeś to z 'permutacją'. Ostatnio zorientowałem się, jak używać 'np.einsum' zamiast" np.any' "(http://stackoverflow.com/a/31824255/3293881), ponownie, bawiąc się z nim. – Divakar