Я хотел бы повторить то, что уже было сказано в другом ответе: класс np.matrix
имеет гораздо больше недостатков, чем преимуществ в наши дни, и я предлагаю перейти к использованию только класса np.array
.Матричное умножение массивов может быть легко записано с использованием оператора @
, поэтому запись в большинстве случаев такая же элегантная, как и для класса matrix
(и у массивов нет нескольких ограничений, которые есть у матриц).
При этом все, что вам нужно, можно сделать с помощью звонка на номер np.einsum
.Нам нужно сжать определенные индексы трех матриц, оставив один индекс в двух матрицах.То есть мы хотим выполнить w_{ij} * Cov_{jk} * w.T_{ki}
с суммированием по j
, k
, что даст нам массив с индексами i
.Будет выполнен следующий вызов einsum
:
res = np.einsum('ij,jk,ik->i', weights, Cov_matrix, weights)
Обратите внимание, что приведенное выше даст вам один 1d массив, тогда как у вас изначально был список массивов с формой (1,1)
.Я подозреваю, что приведенный выше результат будет иметь больше смысла.Также обратите внимание, что я пропустил транспонирование во втором аргументе weights
, и именно поэтому соответствующие индексы суммирования отображаются как ik
, а не ki
.Это должно быть немного быстрее.
Чтобы доказать, что приведенное выше дает тот же результат:
In [8]: results # original
Out[8]: [array([[0.02803215]]), array([[0.02280609]]), array([[0.0318784]])]
In [9]: res # einsum
Out[9]: array([0.02803215, 0.02280609, 0.0318784 ])