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

使用Numpy有效地计算欧几里得距离矩阵

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

使用Numpy有效地计算欧几里得距离矩阵

您可以利用以下

complex
类型:

# build a complex array of your cellsz = np.array([complex(c.m_x, c.m_y) for c in cells])

第一个解决方案

# mesh this array so that you will have all combinationsm, n = np.meshgrid(z, z)# get the distance via the normout = abs(m-n)

第二解决方案

网格划分是主要思想。但它

numpy
很聪明,因此您不必生成
m
n
。只需使用的转置版本计算差异即可
z
。网格自动完成:

out = abs(z[..., np.newaxis] - z)

第三种解决方案

如果

z
直接设置为二维数组,则可以使用
z.T
而不是weird
z[..., np.newaxis]
。所以最后,您的代码将如下所示:

z = np.array([[complex(c.m_x, c.m_y) for c in cells]]) # notice the [[ ... ]]out = abs(z.T-z)

>>> z = np.array([[0.+0.j, 2.+1.j, -1.+4.j]])>>> abs(z.T-z)array([[ 0.        ,  2.23606798,  4.12310563],       [ 2.23606798,  0.        ,  4.24264069],       [ 4.12310563,  4.24264069,  0.        ]])

作为补充,您以后可能想删除重复项,取上三角形:

>>> np.triu(out)array([[ 0.        ,  2.23606798,  4.12310563],       [ 0.        ,  0.        ,  4.24264069],       [ 0.        ,  0.        ,  0.        ]])

一些基准

>>> timeit.timeit('abs(z.T-z)', setup='import numpy as np;z = np.array([[0.+0.j, 2.+1.j, -1.+4.j]])')4.645645342274779>>> timeit.timeit('abs(z[..., np.newaxis] - z)', setup='import numpy as np;z = np.array([0.+0.j, 2.+1.j, -1.+4.j])')5.049334864854522>>> timeit.timeit('m, n = np.meshgrid(z, z); abs(m-n)', setup='import numpy as np;z = np.array([0.+0.j, 2.+1.j, -1.+4.j])')22.489568296184686


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

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

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