J_y*_*ang 22 python arrays math numpy euclidean-distance
我不确定"规范"和"欧几里德距离"是否意味着同样的事情.请你帮我解决这个问题.
我有一个nby m数组a,其中m> 3.我想计算第二个数据点a[1,:]与所有其他点(包括它自身)之间的Eculidean距离.所以我使用了np.linalg.norm,它输出了两个给定点的范数.但我不知道这是否是获得ED的正确方法.
import numpy as np
a = np.array([[0, 0, 0 ,0 ], [1, 1 , 1, 1],[2,2, 2, 3], [3,5, 1, 5]])
N = a.shape[0] # number of row
pos = a[1,:] # pick out the second data point.
dist = np.zeros((N,1), dtype=np.float64)
for i in range(N):
dist[i]= np.linalg.norm(a[i,:] - pos)
Run Code Online (Sandbox Code Playgroud)
ali*_*i_m 33
甲范数是一个函数,它的矢量作为输入,并返回可被解释为"大小","长度",或者说矢量的"大小"的标量值.更正式地,规范被定义为具有以下数学属性:
欧几里德范数(也称为L²范数)只是众多不同规范中的一种 - 也有最大范数,曼哈顿范数等.单个矢量的L²范数相当于从该点到原点的欧几里德距离,两个向量之差的L²范数等于两个点之间的欧几里德距离.
正如@nobar的回答所说,np.linalg.norm(x - y, ord=2)(或者只是np.linalg.norm(x - y))会给你向量x和之间的欧几里德距离y.
由于你想要计算其中a[1, :]每一行之间的欧几里德距离a,你可以通过消除for循环并在以下行上广播来更快地完成这项工作a:
dist = np.linalg.norm(a[1:2] - a, axis=1)
Run Code Online (Sandbox Code Playgroud)
使用广播自己计算欧几里德距离也很容易:
dist = np.sqrt(((a[1:2] - a) ** 2).sum(1))
Run Code Online (Sandbox Code Playgroud)
最快的方法可能是scipy.spatial.distance.cdist:
from scipy.spatial.distance import cdist
dist = cdist(a[1:2], a)[0]
Run Code Online (Sandbox Code Playgroud)
(1000,1000)数组的某些时序:
a = np.random.randn(1000, 1000)
%timeit np.linalg.norm(a[1:2] - a, axis=1)
# 100 loops, best of 3: 5.43 ms per loop
%timeit np.sqrt(((a[1:2] - a) ** 2).sum(1))
# 100 loops, best of 3: 5.5 ms per loop
%timeit cdist(a[1:2], a)[0]
# 1000 loops, best of 3: 1.38 ms per loop
# check that all 3 methods return the same result
d1 = np.linalg.norm(a[1:2] - a, axis=1)
d2 = np.sqrt(((a[1:2] - a) ** 2).sum(1))
d3 = cdist(a[1:2], a)[0]
assert np.allclose(d1, d2) and np.allclose(d1, d3)
Run Code Online (Sandbox Code Playgroud)
“范数”的概念是数学中的广义概念,当应用于向量(或向量差)时,广义上代表某种长度度量。有多种不同的计算范式的方法,但是一种称为欧几里德距离的方法称为“ 2-范数”,它基于应用2的指数(“平方”),并且在求和后应用1/2的指数(“平方根”)。
在文档中这有点晦涩难懂,但是您可以通过设置参数获得两个向量之间的欧几里得距离ord=2。
sum(abs(x)**ord)**(1./ord)
成为sqrt(sum(x**2))。
注意:如@Holt所指出的,默认值为,该默认值ord=None记录为计算向量的“ 2-范数”。因此,这等于ord=2(欧几里得距离)。
| 归档时间: |
|
| 查看次数: |
25095 次 |
| 最近记录: |