【发布时间】:2018-12-17 09:51:10
【问题描述】:
不确定我的标题是否正确,但基本上我有一个参考坐标,格式为 (x,y,z),还有一个大的坐标列表/数组也采用该格式。我需要得到每个之间的欧几里得距离,所以理论上使用 numpy 和 scipy 我应该能够执行以下操作:
import numpy, scipy.spatial.distance
a = numpy.array([1,1,1])
b = numpy.random.rand(20,3)
distances = scipy.spatial.distance.euclidean(b, a)
但我没有得到一个数组,而是得到一个错误:ValueError: Input vector should be 1-D.
不知道如何解决这个错误并获得我想要的东西而不必求助于循环等,这有点违背了使用 Numpy 的目的。
从长远来看,我想使用这些距离来计算真值掩码,以计算 bin 中的距离值。
我不确定我只是使用了错误的函数还是使用了错误的函数,我无法在文档中找到任何可以更好地工作的内容。
【问题讨论】:
-
您正在阅读哪些文档? docs.scipy.org/doc/scipy-1.0.0/reference/spatial.distance.html 的文档似乎很清楚这个函数需要一维输入。
-
如果你可以使用编译器,这样的问题真的很容易实现。例如。优于 cdist stackoverflow.com/a/49573091/4045774 还要准确输入您的输入内容(列表与数组非常不同)。关于 bincounting/digitize stackoverflow.com/a/50496823/4045774 的一些示例
-
@Will 以clang为例。它将 C 代码转换为 LLVM-IR,在此步骤之后,LLVM 后端生成机器代码。例如,Numba 将 Python 代码转换为 LLVM-IR,LLVM-IR 将由 LLVM 后端编译为机器代码。 Cython 将 Python 代码转换为 C,机器代码由 C 编译器创建。 Numba 仅支持一小部分 Python 语言或非常小的模块子集,但它是提高关键代码路径性能的好工具。
标签: python arrays numpy scipy euclidean-distance