我有一個 mn x n個矩陣的串列和一個 m 個實數值(alphas)的串列。n 和 m 的值可能非常大。我正在嘗試計算具有 alpha 權重的矩陣的加權和。
我想知道是否有一個 numpy 函式(或任何其他庫)可以比手動 for 回圈方法更快地做到這一點。
我在下面包含了我當前的功能。
def calculate_matrix_sums(mats, alphas):
"""
Calculate the weighted sum of matrices in mats with weights alpha
"""
k_mults = [np.multiply(mats[i], alphas[i]) for i in range(len(alphas))]
k_sums1 = np.matrix(k_mults[0]) np.matrix(k_mults[1])
for i in range(2, len(k_mults)):
k_sums1 = k_sums1 np.asmatrix(k_mults[i])
k_sums2 = np.asarray(k_sums1).astype(float)
k_sums2 = k_sums2.reshape(len(mats[0]), len(mats[0]))
return k_sums2
和示例代碼:
matrices = np.asarray([np.array([[1., 0.77841638, 0.53239253, 0.9444068, 0.93024477],
[0.77841638, 1., 0.7221497, 0.5805838, 0.68501944],
[0.53239253, 0.7221497, 1., 0.36986265, 0.62792847],
[0.9444068, 0.5805838, 0.36986265, 1., 0.88303226],
[0.93024477, 0.68501944, 0.62792847, 0.88303226, 1.]]),
np.array([[1., 0.45650032, 0.13898701, 0.83605729, 0.79743304],
[0.45650032, 1., 0.36094014, 0.18229867, 0.30596445],
[0.13898701, 0.36094014, 1., 0.04443844, 0.23300302],
[0.83605729, 0.18229867, 0.04443844, 1., 0.67745532],
[0.79743304, 0.30596445, 0.23300302, 0.67745532, 1.]])])
alpha_vals = [0.47547796, 0.52452204]
print(calculate_matrix_sums(matrices, alpha_vals))
任何建議表示贊賞。
uj5u.com熱心網友回復:
您可以重新調整形狀alpha_vals,使其在第一個軸上matrices正確廣播:
(np.array(alpha_vals)[:, None, None] * matrices).sum(axis=0)
或者,您可以調整 的步幅matrices,使最后一個維度對應于alpha_vals:
(np.moveaxis(matrices, 0, -1) * alpha_vals).sum(axis=-1)
您也可以np.einsum用于此類事情(可能是最優雅的解決方案):
np.einsum('ijk,i->jk', matrices, alpha_vals)
uj5u.com熱心網友回復:
如果你想要一個矩陣結果,它很簡單:
def calculate_matrix_sums(mats, alphas):
"""
Calculate the weighted sum of matrices in mats with weights alpha
"""
return np.sum( m * a for m,a in zip(mats,alphas))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/497827.html
