栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

更有效的方式来计算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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571045.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号