Установка переменных, которые вы сделали, - довольно ужасный способ, если вы делаете это, как вы, кажется, уже поняли. Если все ваши матрицы хороши и квадратны, вам нужна только одна переменная для хранения всего стека в форме (len(node2), 2, 2)
.
Еще один момент - это индексирование. Numpy массивы не списки. Ваши индексы должны выглядеть как [1, 0]
, а не [1][0]
. Ответы вроде следующего бесстыдного плагина объясняют, почему: { ссылка }.
Предположим, что sOrP
и frequenciesList
- это numpy массивы. Если нет, оберните их в вызов np.array
. Вы можете сделать стек следующим образом:
matrices = np.broadcast_to([[[1, 0], [0, 1]]], (len(node2), 2, 2)).copy()
maskS = (sOrP == 'S')
maskP = (sOrP == 'P')
matrices[maskS, 0, 1] = frequenciesList[maskS]
matrices[maskP, 1, 0] = 1 / frequenciesList[maskP]
Вы можете проверить, что matrices[i]
эквивалентно matrixi
в вашей первоначальной конструкции.
Простой способ умножить все матрицы вместе будет использовать al oop:
Ty = np.eye(2)
for mat in matrices:
Ty @= mat
Но numpy это все о векторизации. Как оказалось, np.linalg.miltidot
было сделано для оптимизации этой точной операции:
Ty = np.linalg.multidot(matrices)