我在3D中有两点:
(xa, ya, za)
(xb, yb, zb)
Run Code Online (Sandbox Code Playgroud)
我想计算距离:
dist = sqrt((xa-xb)^2 + (ya-yb)^2 + (za-zb)^2)
Run Code Online (Sandbox Code Playgroud)
使用NumPy或Python的最佳方法是什么?我有:
a = numpy.array((xa ,ya, za))
b = numpy.array((xb, yb, zb))
Run Code Online (Sandbox Code Playgroud) 如果有一个库我将使用至少两种方法,那么下面的性能或内存使用是否有任何差异?
from X import method1, method2
Run Code Online (Sandbox Code Playgroud)
和
import X
Run Code Online (Sandbox Code Playgroud) 我目前正在将数据读入一个看起来像这样的数据框.
City XCord YCord
Boston 5 2
Phoenix 7 3
New York 8 1
..... . .
Run Code Online (Sandbox Code Playgroud)
我想根据这些数据创建欧几里德距离矩阵,显示所有城市对之间的距离,这样我得到一个结果矩阵,如:
Boston Phoenix New York
Boston 0 2.236 3.162
Phoenix 2.236 0 2.236
New York 3.162 2.236 0
Run Code Online (Sandbox Code Playgroud)
在我的实际数据框架中有更多的城市和坐标,所以我需要能够以某种方式迭代所有城市对并创建一个像我上面所示的距离矩阵,但我不知道如何配对所有引用并引用欧几里德距离公式?任何帮助,将不胜感激.
我是Python的新手,所以这个问题可能看起来很琐碎.但是,我没有找到类似的情况.我有一个20个节点的坐标矩阵.我想计算此集合中所有节点对之间的欧氏距离,并将它们存储在成对矩阵中.例如,如果我有20个节点,我希望最终结果是(20,20)的矩阵,每个节点对之间的欧几里德距离值.我尝试使用for循环遍历坐标集的每个元素并计算欧氏距离,如下所示:
ncoord=numpy.matrix('3225 318;2387 989;1228 2335;57 1569;2288 8138;3514 2350;7936 314;9888 4683;6901 1834;7515 8231;709 3701;1321 8881;2290 2350;5687 5034;760 9868;2378 7521;9025 5385;4819 5943;2917 9418;3928 9770')
n=20
c=numpy.zeros((n,n))
for i in range(0,n):
for j in range(i+1,n):
c[i][j]=math.sqrt((ncoord[i][0]-ncoord[j][0])**2+(ncoord[i][1]-ncoord[j][1])**2)
Run Code Online (Sandbox Code Playgroud)
但是,我收到的错误是"输入必须是方阵".我想知道是否有人知道这里发生了什么.谢谢
import numpy as np
from datetime import datetime
import math
def norm(l):
s = 0
for i in l:
s += i**2
return math.sqrt(s)
def foo(a, b, f):
l = range(a)
s = datetime.now()
for i in range(b):
f(l)
e = datetime.now()
return e-s
foo(10**4, 10**5, norm)
foo(10**4, 10**5, np.linalg.norm)
foo(10**2, 10**7, norm)
foo(10**2, 10**7, np.linalg.norm)
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
0:00:43.156278
0:00:23.923239
0:00:44.184835
0:01:00.343875
Run Code Online (Sandbox Code Playgroud)
似乎当np.linalg.norm多次调用小尺寸数据时,它的运行速度比我的标准函数慢。
其原因何在?
我用下面的python代码计算欧几里德距离:
def getNeighbors(trainingSet, testInstance, k, labels):
distances = []
for x in range(len(trainingSet)):
dist = math.sqrt(((testInstance[0] - trainingSet[x][0]) ** 2) + ((testInstance[1] - trainingSet[x][1]) ** 2))
distances.append([dist, labels[x]])
distances = np.array(distances)
return distances
Run Code Online (Sandbox Code Playgroud)
为了计算给定点与其他10个点的距离,这很好.但是当我用18563个其他点计算一个点的距离时,计算机会被挂起并且在3小时左右没有响应.
如何更快地计算 18563 点?