更有效的方式来计算numpy的距离?

更有效的方式来计算numpy的距离?,第1张

更有效的方式来计算numpy的距离?

每当您有乘法和和时,请尝试使用点积函数或之一

np.einsum
。由于要预分配数组,而不是为水平和垂直坐标使用不同的数组,因此将它们堆叠在一起:

precomputed_flat = np.column_stack((svf.flatten(), shf.flatten()))measured_flat = np.column_stack((VVmeasured.flatten(), HHmeasured.flatten()))deltas = precomputed_flat - measured_flat[:, None, :]

从这里开始,最简单的方法是:

dist = np.einsum('ijk,ijk->ij', deltas, deltas)

您也可以尝试以下方法:

from numpy.core.umath_tests import inner1ddist = inner1d(deltas, deltas)

当然也有SciPy的空间模块

cdist

from scipy.spatial.distance import cdistdist = cdist(precomputed_flat, measured_flat, 'euclidean')

编辑 我无法在如此大的数据集上运行测试,但是这些时间颇具启发性:

len_a, len_b = 10000, 1000a = np.random.rand(2, len_a)b =  np.random.rand(2, len_b)c = np.random.rand(len_a, 2)d = np.random.rand(len_b, 2)In [3]: %timeit a[:, None, :] - b[..., None]10 loops, best of 3: 76.7 ms per loopIn [4]: %timeit c[:, None, :] - d1 loops, best of 3: 221 ms per loop

对于上述较小的数据集,通过在内存中以不同的方式排列数据,我可以稍微加快使用

scipy.spatial.distance.cdist
和匹配方法的速度
inner1d

precomputed_flat = np.vstack((svf.flatten(), shf.flatten()))measured_flat = np.vstack((VVmeasured.flatten(), HHmeasured.flatten()))deltas = precomputed_flat[:, None, :] - measured_flatimport scipy.spatial.distance as spdistfrom numpy.core.umath_tests import inner1dIn [13]: %timeit r0 = a[0, None, :] - b[0, :, None]; r1 = a[1, None, :] - b[1, :, None]; r0 *= r0; r1 *= r1; r0 += r110 loops, best of 3: 146 ms per loopIn [14]: %timeit deltas = (a[:, None, :] - b[..., None]).T; inner1d(deltas, deltas)10 loops, best of 3: 145 ms per loopIn [15]: %timeit spdist.cdist(a.T, b.T)10 loops, best of 3: 124 ms per loopIn [16]: %timeit deltas = a[:, None, :] - b[..., None]; np.einsum('ijk,ijk->jk', deltas, deltas)10 loops, best of 3: 163 ms per loop


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5562290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存