(M,N) 和 (N,) 数组之间的距离计算

2024-04-20 04:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用python计算欧几里德距离。我想学习如何在不使用for循环的情况下计算它。这是我的密码

import numpy as np
import random
A = np.random.randint(5, size=(10, 5))
B = [1, 3, 5, 2, 4]
for i in range(10):
    dist = np.linalg.norm(A[i]-B)
    print("Distances: ", dist)

我是否可以使用高级索引或任何其他技术来计算距离而不使用for循环?谢谢。你知道吗


Tags: inimportnumpy距离密码forsizedist
2条回答

方法#1:最直接的方法是使用np.linalg.norm参数并利用axis参数broadcasting-

np.linalg.norm(A-B,axis=1)

方法#2:einsum-

subs = A - B
out = np.sqrt(np.einsum('ij,ij->i',subs,subs))

方法#3:使用(a-b)^2 = a^2 + b^2 - 2ab公式利用matrix-multiplicationnp.dotnp.inner-

np.sqrt(np.einsum('ij,ij->i',A, A) + np.inner(B,B) - 2*A.dot(B))

可以显式计算Frobenius Norm

res = (np.abs(A - B)**2).sum(1)**0.5

这是^{}的默认值。下面是一个演示:

np.random.seed(0)
A = np.random.randint(5, size=(10, 5))
B = [1, 3, 5, 2, 4]

res = (np.abs(A - B)**2).sum(1)**0.5

array([4.89897949, 5.38516481, 5.29150262, 5.47722558, 5.        ,
       5.56776436, 6.244998  , 2.23606798, 5.56776436, 4.47213595])

相关问题 更多 >