В моем текущем проекте мне нужно " свертить" два трехмерных массива несколько необычным способом:
Предположим, что мы имеем два трехмерных массива A и B с размерами dimA и dimB (одинаковые для каждой оси). Теперь мы хотим создать третий массив C с размерами dimA + dimB для каждой оси.
Записи C вычисляются как:
c_{x1+x2,y1+y2,z1+z2} += a_{x1,y1,z1} * b_{x2,y2,z2}
Моя текущая версия проста:
dimA = A.shape[0]
dimB = B.shape[0]
dimC = dimA+dimB
C = np.zeros((dimC,dimC,dimC))
for x1 in range(dimA):
for x2 in range(dimB):
for y1 in range(dimA):
for y2 in range(dimB):
for z1 in range(dimA):
for z2 in range(dimB):
x = x1+x2
y = y1+y2
z = z1+z2
C[x,y,z] += A[x1,y1,z1] * B[x2,y2,z2]
К сожалению, эта версия очень медленная и непригодна для использования.
Моя вторая версия была:
C = scipy.signal.fftconvolve(A,B,mode="full")
Но это вычисляет только элементы max(dimA,dimB)
У кого-нибудь есть идея?