rzeczywisty problem życzę rozwiązania jest, biorąc pod uwagę zestaw N wektor jednostkowy i inny zestaw M wektorów obliczyć dla każdej jednostki wektory średnią wartość bezwzględna iloczynu punktowego z każdym z wektorów M. Zasadniczo polega to na obliczeniu zewnętrznego produktu obu matryc oraz zsumowaniu i uśrednieniu z wartością bezwzględną utkniętą pomiędzy.nietrywialnym sumy produktów zewnętrznych bez tymczasowych w numpy
Dla N i M nie jest zbyt duży to nie jest trudne i istnieje wiele sposobów, aby kontynuować (patrz niżej). Problem polega na tym, że utworzone pliki tymczasowe są ogromne i stanowią praktyczne ograniczenie dla dostarczonego podejścia. Czy te obliczenia można wykonać bez tworzenia tymczasowych? Główna trudność, jaką mam, wynika z obecności wartości bezwzględnej. Czy istnieją ogólne techniki "gwintowania" takich obliczeń?
Jako przykład należy rozważyć następujący kod
N = 7
M = 5
# Create the unit vectors, just so we have some examples,
# this is not meant to be elegant
phi = np.random.rand(N)*2*np.pi
ctheta = np.random.rand(N)*2 - 1
stheta = np.sqrt(1-ctheta**2)
nhat = np.array([stheta*np.cos(phi), stheta*np.sin(phi), ctheta]).T
# Create the other vectors
m = np.random.rand(M,3)
# Calculate the quantity we desire, here using broadcasting.
S = np.average(np.abs(np.sum(nhat*m[:,np.newaxis,:], axis=-1)), axis=0)
to jest wielki S jest tablicą długości N i zawiera żądane wyniki. Niestety w tym procesie stworzyliśmy potencjalnie ogromne tablice. Wynikiem
np.sum(nhat*m[:,np.newaxis,:], axis=-1)
jest M X N tablicy. Końcowy wynik, oczywiście, ma tylko rozmiar N. Zacznij zwiększać rozmiary N i M, a my szybko napotkamy błąd pamięci.
Jak stwierdzono powyżej, jeśli wartość bezwzględna nie wymaga to można postępować jak następuje teraz za pomocą einsum()
T = np.einsum('ik,jk,j', nhat, m, np.ones(M))/M
Działa to działa szybko i nawet w przypadku bardzo dużej N i M. Aby rozwiązać konkretny problem, potrzebuję dodać abs()
, ale bardziej ogólne rozwiązanie (być może bardziej ogólne ufunc) również byłoby interesujące.
można zrobić z [ 'dot'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html), a niektóre oś błahy? – user2357112
['tensordot'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html#numpy.tensordot) może być bardziej przydatny. – user2357112
Nie jest oczywiste, w jaki sposób pomaga to ze względu na potrzebę "abs()". Gdyby nie to, wyrażenie 'einsum()' w pytaniu byłoby idealne! –