Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向量列表中的最小距离_Python_Pandas - Fatal编程技术网

Python 向量列表中的最小距离

Python 向量列表中的最小距离,python,pandas,Python,Pandas,1:12 4 2:456 3:789 4:02 5 冒号前的数字是冒号后三维向量的标签。我有另一个向量,比如(12,13,14)。我需要找到这个向量和给定向量列表之间的最小距离,然后分配标签作为结果。有什么建议吗?我在用熊猫 使用np.linalg.norm查找欧几里德距离 In [359]: p = (12, 13, 14) In [360]: df.apply(lambda x: np.linalg.norm(x-p), axis=1) Out[360]: 0 18.493242 1

1:12 4
2:456
3:789
4:02 5


冒号前的数字是冒号后三维向量的标签。我有另一个向量,比如(12,13,14)。我需要找到这个向量和给定向量列表之间的最小距离,然后分配标签作为结果。有什么建议吗?我在用熊猫

使用
np.linalg.norm
查找欧几里德距离

In [359]: p = (12, 13, 14)

In [360]: df.apply(lambda x: np.linalg.norm(x-p), axis=1)
Out[360]:
0    18.493242
1    13.856406
2     8.660254
3    18.601075
dtype: float64

In [361]: df.apply(lambda x: np.linalg.norm(x-p), axis=1).idxmin()
Out[361]: 2

In [363]: df.loc[df.apply(lambda x: np.linalg.norm(x-p), axis=1).idxmin()]
Out[363]:
x    7
y    8
z    9
Name: 2, dtype: int64
或者,您也可以用更短的语法找到距离

In [377]: (df-p).apply(np.linalg.norm, 1)
Out[377]:
0    18.493242
1    13.856406
2     8.660254
3    18.601075
dtype: float64

当然,这取决于您的距离度量,但类似于

diffs = df - v
distances = diffs.pow(2).sum(axis=1).pow(.5)
return distances.idxmin()
如果
v
是一个与
df
中的行长度相同的列表或数组,则应该可以工作。这将给出欧几里德距离。您可能希望在
numpy
中执行此操作以获得更好的性能。比如:

diffs = arr - v
distances = (diffs ** 2).sum(axis=1) ** .5
return distances.argmin()
编辑: 借鉴@John Galt的解决方案,这可以通过以下方式以更简单、更快的方式实现:

df.index[np.linalg.norm(df - p, axis=1).argmin()]

你试了什么?请添加解决问题的尝试:)向量与向量之间没有“距离”。那将是点(在三维欧几里德空间中)@AlienLifeForm我们都知道这是什么意思。。。语义学的论点很少对任何人有帮助。@Aaron语义学是关于“的意义”的,我认为这很重要。(我的分析力学老师会因为我说向量有距离而对我开枪)。以防万一,我想到的第一件事是他被赋予了字符向量,必须寻找一些字符串距离。@AlienLifeForm“的含义”因人而异,这取决于他们的背景和经验。如果我指的是金属的纹理,我的同事们自然会知道我指的是单晶颗粒的大小和取向分布。如果我告诉其他人,他们可能会认为我说的是表面光洁度。这就是为什么上下文比语义更重要的原因,在本例中,这一点是非常清楚的。最好是执行
i=np.linalg.norm(df-p,axis=1.argmin()
idx=df.index[i]
。这应该是一个数量级的快速感谢我能让它工作。一个问题是,我可以得到坐标和索引,但是如果标签是随机整数或字符串呢。你建议如何获得这些标签?