使用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)