使用numpy求和,其中i!=j

我需要计算下面的总和,其中 X 是矩阵 2x5,i/j 是选定的列。

我已经用下面的代码解决了这个问题,但我想知道是否有一个更简单的 numpy 解决方案来解决这个总和(没有 for..range)

sum = 0
size = 5
for i in range(0, size):
    for j in range(0, size):
        if i != j:
            sum = sum + np.power(np.linalg.norm(X[:, i] - X[:, j]), 2)

回答

您可以在这里进行相当多的优化。首先,您只需要计算完整 ij 矩阵的非对角元素。其次,您可以只计算矩阵的一半并将总和加倍,因为norm(a - b) == norm(b - a)

使用np.triu_indices(或np.tril_indices):

i, j = np.triu_indices(size, 1)
sum = 2 * (np.linalg.norm(X[:, i] - X[:, j], axis=0)**2).sum()

您可以避免平方根(假设您使用的是 2 范数):

sum = 2 * (X[:, i] - X[:, j])**2).sum(None)


以上是使用numpy求和,其中i!=j的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>