В моем приложении много смысла переносить матрицы матриц. Поскольку numpy это не нравится, а работа с массивами в большинстве случаев легче, в итоге я получил массивы массивов. Я вполне доволен ими.
Это выглядит так:
[ [S11hh S11hv] [S12hh S12hv] ]
[ [S11vh S11vv] [S12vh S12vv] ]
S = [ ]
[ [S21hh S21hv] [S22hh S22hv] ]
[ [S21vh S21vv] [S22vh S22vv] ]
(Это для коэффициентов отражения и пропускания в горизонтальной и вертикальной поляризациях, это оптика.)
Однако в какой-то момент в моем коде мне нужно выполнить умножение матриц, используя все S, а не только его части:
M = S.dot(L)
где L выглядит так:
[ [L1hh L1hv] ]
[ [L1vh L1vv] ]
L = [ ]
[ [L2hh L2hv] ]
[ [L2vh L2vv] ]
Если я наивно бегу
M = S.dot(L)
Я получаю что-то в 6 измерениях, а это не то, чего я хочу. На самом деле я ожидаю, что результат будет точно таким же, как если бы мои массивы были просто матрицами:
[ S11hh S11hv S12hh S12hv ]
[ S11vh S11vv S12vh S12vv ]
S = [ S21hh S21hv S22hh S22hv ]
[ S21vh S21vv S22vh S22vv ]
[ L1hh L1hv ]
[ L1vh L1vv ]
L = [ L2hh L2hv ]
[ L2vh L2vv ]
Тогда я бы перегруппировал элементы 4 на 4.
Что представляет собой элегантный цифровой способ создания матриц из этих массивов? Я пробовал bmat, но bmat не доволен тем, что у меня есть; по какой-то причине он хорошо работает со списком матриц, но не с массивом 4D.