在 Python 中将矩阵条目 K_ij 除以 K_ii*K_jj 的快速方法
Quick way to divide matrix entries K_ij by K_ii*K_jj in Python
在 Python 中,我有一个维度为 (N x N) 的矩阵 K。我想通过将每个条目 K_ij 除以 sqrt(K_(i,i)*K_(j,j)) 来规范化 K。在 Python 中无需遍历每个条目即可快速实现此目的的方法是什么?
我目前的解决方案是:
import numpy as np
K = np.random.rand(3,3)
diag = np.diag(K)
for i in range(np.shape(K)[0]):
for j in range(np.shape(K)[1]):
K[i,j] = K[i,j]/np.sqrt(diag[i]*diag[j])
当然,您必须遍历每个条目,至少在内部如此。对于方阵:
K / np.sqrt(np.einsum('ii,jj->ij', K, K))
如果矩阵不是正方形,您首先必须定义应该用什么替换 "missing" 值 K[i,i]
其中 i > j
等
备选方案:使用 numba
让循环保持原样,获得免费加速,甚至避免中间分配:
@njit
def normalize(K):
M = np.empty_like(K)
m, n = K.shape
for i in range(m):
Kii = K[i,i]
for j in range(n):
Kjj = K[j,j]
M[i,j] = K[i,j] / np.sqrt(Kii * Kjj)
return M
在 Python 中,我有一个维度为 (N x N) 的矩阵 K。我想通过将每个条目 K_ij 除以 sqrt(K_(i,i)*K_(j,j)) 来规范化 K。在 Python 中无需遍历每个条目即可快速实现此目的的方法是什么?
我目前的解决方案是:
import numpy as np
K = np.random.rand(3,3)
diag = np.diag(K)
for i in range(np.shape(K)[0]):
for j in range(np.shape(K)[1]):
K[i,j] = K[i,j]/np.sqrt(diag[i]*diag[j])
当然,您必须遍历每个条目,至少在内部如此。对于方阵:
K / np.sqrt(np.einsum('ii,jj->ij', K, K))
如果矩阵不是正方形,您首先必须定义应该用什么替换 "missing" 值 K[i,i]
其中 i > j
等
备选方案:使用 numba
让循环保持原样,获得免费加速,甚至避免中间分配:
@njit
def normalize(K):
M = np.empty_like(K)
m, n = K.shape
for i in range(m):
Kii = K[i,i]
for j in range(n):
Kjj = K[j,j]
M[i,j] = K[i,j] / np.sqrt(Kii * Kjj)
return M