1:1 2 4
2:4 5 6
3:7 8 9
4:0 2 5
结肠前的数字是结肠后面的3-D载体的标签。我还有另一个矢量(12,13,14)。我需要找到这个向量和给定的向量列表之间的最小距离,然后分配标签作为结果。有什么建议?我正在使用熊猫。
答案 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()]