我有两套2D点,需要计算距离矩阵。 我需要尽快使用NumPy广播。 在计算距离矩阵的两种方法中,我不理解为什么一个比另一个好。
https://github.com/numpy/numpy/issues/14761“rel=“nofollow noreferer”> 我的结果自相矛盾。 计算距离矩阵的单位[3、4、6]和[8、9],但3+4使用<代码>代号<>>>>。 使用广播的频率超过8个,使用<代码>hypot的频率高于9个,这是简单的方式。 我没有尝试过斯堪 Python,假定它永远不会结束。
- Is there a faster way to calculate distance matrix?
- Why
hypot
andsubtract.outer
are faster?
法典(改变种子以防止切除):
### 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 ms, total: 3.42 ms
Wall time: 1.84 ms
### Cell 3
%%time
d0 = np.subtract.outer(obs[:,0], interp[:,0])
CPU times: user 2.46 s, sys: 1.97 s, total: 4.42 s
Wall time: 4.42 s
### Cell 4
%%time
d1 = np.subtract.outer(obs[:,1], interp[:,1])
CPU times: user 3.1 s, sys: 2.7 s, total: 5.8 s
Wall time: 8.34 s
### Cell 5
%%time
h = np.hypot(d0, d1)
CPU times: user 12.7 s, sys: 24.6 s, total: 37.3 s
Wall time: 1min 6s
### Cell 6
np.random.seed(773228)
### Cell 7
%%time
obs = np.random.random((50000, 2))
interp = np.random.random((30000, 2))
CPU times: user 1.84 ms, sys: 1.56 ms, total: 3.4 ms
Wall time: 2.03 ms
### Cell 8
%%time
d = obs[:, np.newaxis, :] - interp
d0, d1 = d[:, :, 0], d[:, :, 1]
CPU times: user 22.7 s, sys: 8.24 s, total: 30.9 s
Wall time: 33.2 s
### Cell 9
%%time
h = np.sqrt(d0**2 + d1**2)
CPU times: user 29.1 s, sys: 2min 12s, total: 2min 41s
Wall time: 6min 10s