相关疑难解决方法(0)

两个不同Numpy阵列中点之间的最小欧几里德距离,而不是在

我有两个x - y坐标数组,我想找到一个数组中每个点与另一个数组中所有点之间的最小欧几里德距离.阵列的大小不一定相同.例如:

xy1=numpy.array(
[[  243,  3173],
[  525,  2997]])

xy2=numpy.array(
[[ 682, 2644],
[ 277, 2651],
[ 396, 2640]])
Run Code Online (Sandbox Code Playgroud)

我目前的方法遍历每个坐标xyxy1计算之间的协调距离和其他坐标.

mindist=numpy.zeros(len(xy1))
minid=numpy.zeros(len(xy1))

for i,xy in enumerate(xy1):
    dists=numpy.sqrt(numpy.sum((xy-xy2)**2,axis=1))
    mindist[i],minid[i]=dists.min(),dists.argmin()
Run Code Online (Sandbox Code Playgroud)

有没有办法消除for循环,并以某种方式在两个数组之间进行逐元素计算?我设想生成一个距离矩阵,我可以在其中找到每行或每列中的最小元素.

另一种看待问题的方法.假设我将xy1(长度为m)和xy2(长度为p)连接成xy(长度为n),并存储原始数组的长度.从理论上讲,我应该能够从那些我可以获取mxp子矩阵的坐标生成一个nxn距离矩阵.有没有办法有效地生成这个子矩阵?

python numpy euclidean-distance

39
推荐指数
5
解决办法
3万
查看次数

为什么 np.hypot 和 np.subtract.outer 与普通广播相比非常快?使用 Numba 并行加速 numpy 进行距离矩阵计算

我有两组大的 2D 点,我需要计算一个距离矩阵。

我需要它在 python 中运行得很快,所以很明显我使用了 numpy。我最近了解了 numpy 广播并使用了它,而不是在 python 中循环,numpy 将在 C 中进行。

我真的认为广播就是我所需要的,直到我看到其他方法比普通广播更好,我有两种计算距离矩阵的方法,但我不明白为什么一种比另一种更好。

我在这里查找https://github.com/numpy/numpy/issues/14761并且我得到了相互矛盾的结果。

下面是两种计算距离矩阵的方法

单元格 [3, 4, 6] 和 [8, 9] 都计算距离矩阵,但 3+4 使用减法。outer 比使用 vanilla 广播的 8 快,使用 hypot 的 6 比 9 快,这很简单道路。我没有尝试在 python 循环中假设它永远不会完成。

我想知道

1. 有没有更快的方法来计算距离矩阵(可能是 scikit-learn 或 scipy)?

2.为什么hypot和subtract.outer这么快?

为了方便起见,我还附上了代码段 tp run 整个事情,并更改了种子以防止缓存恢复

### Cell 1
import numpy as np

np.random.seed(858442)

### Cell 2
%%time
obs = np.random.random((50000, 2))
interp = np.random.random((30000, 2))

CPU times: user 2.02 ms, sys: 1.4 …
Run Code Online (Sandbox Code Playgroud)

python numpy vectorization python-3.x numba

6
推荐指数
1
解决办法
207
查看次数