在 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