Broadcasting - трехмерное поле коэффициентов для трехмерного поля матриц с учетом матрицы - PullRequest
0 голосов
/ 25 июня 2018

У меня есть (большой) 4D массив, состоящий из 5 коэффициентов в заданном базисе для поля матрицы.Учитывая 5 базисных матриц, я хочу эффективно вычислить поле матрицы.

Поле коэффициента c[x,y,z,i] представляет собой значение i-го коэффициента в положении x, y, z

Иполе матрицы M[x,y,z,a,b], являющееся матрицей (3,3) в позиции x,y,z

, и базисные матрицы T_1,...T_5, являющиеся (3,3) базисными матрицами

, которые я мог бы циклически проходить по каждой позиции впробел:

M[x,y,z,:,:] = T_1[:,:]*c[x,y,z,0] + T_2[:,:]*c[x,y,z,1]...T_5[:,:]*c[x,y,z,4]

Но это очень неэффективно.Мои попытки использования np.multiply, np.sum приводят к ошибкам вещания из-за неоднозначности желаемого продукта, являющегося полем матриц 3х3.

1 Ответ

0 голосов
/ 25 июня 2018

Имейте в виду, что для numpy эти 4 и 5d-массивы - это просто не трехмерные массивы, содержащие 2-мерные матрицы и т. Д.

Давайте попробуем записать ваш расчет таким образом, чтобы уточнить размеры:

M[x,y,z] = T_1*c[x,y,z,0] + T_2*c[x,y,z,1]...T_5*c[x,y,z,4]

M[x,y,z,:,:] = T_1[:,:]*c[x,y,z,0] + T_2[:,:]*c[x,y,z,1]...T_5[:,:]*c[x,y,z,4]

c[x,y,z,i] - это коэффициент, верно?Итак, M является взвешенной суммой массивов T_n?

Один из способов выразить это:

T = np.stack([T_1, T_2, ...T_5], axis=0)   # 3d  (nab)
M = np.einsum('nab,xyzn->xyzab', T, c)

Мы могли бы альтернативно сложить T_i на новой последней оси

T = np.stack([T_1, T_2 ...T_5], axis=2)   # (abn)
M = np.einsum('abn,xyzn->xyzab', T, c)

или как широковещательное умножение плюс сумма:

M = (T[None,None,None,:,:,:] * c[:,:,:,None,None,:]).sum(axis=-1)

Я пишу этот код без тестирования, поэтому могут быть ошибки, но я думаю, что основной план правильный.

Он также может быть записан как dot, если я могу поставить измерение n последним в одном аргументе и вторым - последним в другом.Или с tensordot.Но контроль над вещанием других измерений меньше.

Для тестовых вычислений вы также можете изменить эти массивы так, чтобы x,y,z сворачивались в одно, а a,b - в другое, например,

 M[xyz,:] = T_n[ab]*c[xyz,n]   # etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...