向量列表中的最小距离

时间:2017-08-16 16:13:40

标签: python pandas

  

1:1 2 4
  2:4 5 6
  3:7 8 9
  4:0 2 5

结肠前的数字是结肠后面的3-D载体的标签。我还有另一个矢量(12,13,14)。我需要找到这个向量和给定的向量列表之间的最小距离,然后分配标签作为结果。有什么建议?我正在使用熊猫。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

当然,这取决于您的距离指标,但类似

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()]