在Python中用K_ii*K_jj快速划分矩阵项K_ij的方法

在Python中用K_ii*K_jj快速划分矩阵项K_ij的方法,python,numpy,linear-algebra,Python,Numpy,Linear Algebra,在Python中,我有一个维度为(nxn)的矩阵K。我想通过将每个条目K_ij除以sqrt(K_(I,I)*K_(j,j))来规范化K。在Python中实现这一点的快速方法是什么 我目前的解决办法是: 将numpy导入为np K=np.rand.rand(3,3) diag=np.diag(K) 对于范围内的i(np.形状(K)[0]): 对于范围内的j(np.形状(K)[1]): K[i,j]=K[i,j]/np.sqrt(diag[i]*diag[j]) 当然,您必须遍历每个条目,至少在内部

在Python中,我有一个维度为(nxn)的矩阵K。我想通过将每个条目K_ij除以sqrt(K_(I,I)*K_(j,j))来规范化K。在Python中实现这一点的快速方法是什么

我目前的解决办法是:

将numpy导入为np
K=np.rand.rand(3,3)
diag=np.diag(K)
对于范围内的i(np.形状(K)[0]):
对于范围内的j(np.形状(K)[1]):
K[i,j]=K[i,j]/np.sqrt(diag[i]*diag[j])

当然,您必须遍历每个条目,至少在内部是这样。对于平方矩阵:

K / np.sqrt(np.einsum('ii,jj->ij', K, K))
如果矩阵不是正方形,则首先必须定义应替换“缺失”值的内容
K[i,i]
where
i>j

备选方案:用于保持循环不变,获得免费加速,甚至避免中间分配:

@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

到目前为止你试过什么?请发布您的代码。您可以很容易地组成一个(NxM)矩阵,在每个(i,j)处具有正确的标准化值,然后只使用元素除法。也许添加“@njit”(error\u model=“numpy”)也会很好,以避免代价高昂的零检查除法。