python 欧氏距离_python - 如何用NumPy计算欧氏距离?
我想用各种性能说明来阐述简单的答案。 np.linalg.norm可能比您需要的更多:
dist=numpy.linalg.norm(a-b)
首先 - 此功能旨在处理列表并返回所有值,例如 比较中距离things到点数sqrt的距离:
sP=set(points)pA=point
distances=np.linalg.norm(sP-pA,ord=2,axis=1.)# 'distances' is a list
记住几件事:
Python函数调用很昂贵。
[Regular] Python不会缓存名称查找。
所以
defdistance(pointA,pointB):dist=np.linalg.norm(pointA-pointB)returndist
并不像看起来那样无辜。
>>>dis.dis(distance)20LOAD_GLOBAL0(np)2LOAD_ATTR1(linalg)4LOAD_ATTR2(norm)6LOAD_FAST0(pointA)8LOAD_FAST1(pointB)10BINARY_SUBTRACT12CALL_FUNCTION114STORE_FAST2(dist)316LOAD_FAST2(dist)18RETURN_VALUE
首先 - 每次调用它时,我们必须对“np”进行全局查找,对“linalg”进行范围查找,对“norm”进行范围查找,仅调用函数的开销可以等同于几十个python说明。
最后,我们浪费了两个操作来存储结果并重新加载它以便返回...
第一步改进:使查找更快,跳过商店
defdistance(pointA,pointB,_norm=np.linalg.norm):return_norm(pointA-pointB)
我们得到了更加精简:
>>>dis.dis(distance)20LOAD_FAST2(_norm)2LOAD_FAST0(pointA)4LOAD_FAST1(pointB)6BINARY_SUBTRACT8CALL_FUNCTION110RETURN_VALUE
但是,函数调用开销仍然相当于一些工作。 你会想做基准来确定你自己是否可以更好地做数学:
defdistance(pointX,pointY):return(((pointX.x-pointY.x)**2)+((pointX.y-pointY.y)**2)+((pointX.z-pointY.z)**2))**0.5# fast sqrt
在某些平台上,things比sqrt更快。您的里程可能会有所不同。
****高级演奏说明。
你为什么计算距离? 如果唯一的目的是显示它,
print("The target is %.2fm away"%(distance(a,b)))
向前走。 但是,如果您要比较距离,进行范围检查等,我想添加一些有用的性能观察。
我们来看两种情况:按距离排序或剔除列表到满足范围约束的项目。
# Ultra naive implementations. Hold onto your hat.defsort_things_by_distance(origin,things):returnthings.sort(key=lambdathing:distance(origin,thing))defin_range(origin,range,things):things_in_range=[]forthinginthings:ifdistance(origin,thing)<=range:things_in_range.append(thing)
我们需要记住的第一件事是我们正在使用毕达哥拉斯来计算距离(things),因此我们进行了大量的sqrt次呼叫。 数学101:
dist=root(x^2+y^2+z^2):.dist^2=x^2+y^2+z^2andsq(N)Nandsq(N)>sq(M)iff N>Mandsq(N)=sq(M)iff N==M
简而言之:在我们实际需要以X为单位而不是X ^ 2的距离之前,我们可以消除计算中最难的部分。
# Still naive, but much faster.defdistance_sq(left,right):""" Returns the square of the distance between left and right. """return(((left.x-right.x)**2)+((left.y-right.y)**2)+((left.z-right.z)**2))defsort_things_by_distance(origin,things):returnthings.sort(key=lambdathing:distance_sq(origin,thing))defin_range(origin,range,things):things_in_range=[]# Remember that sqrt(N)**2 == N, so if we square# range, we don't need to root the distances.range_sq=range**2forthinginthings:ifdistance_sq(origin,thing)<=range_sq:things_in_range.append(thing)
太棒了,这两个功能不再做任何昂贵的平方根。 那会更快。 我们还可以通过将in_range转换为生成器来改进in_range:
defin_range(origin,range,things):range_sq=range**2yieldfrom(thingforthinginthingsifdistance_sq(origin,thing)<=range_sq)
如果您正在执行以下操作,这尤其有益:
ifany(in_range(origin,max_dist,things)):...
但如果你要做的下一件事需要距离,
fornearbyinin_range(origin,walking_distance,hotdog_stands):print("%s %.2fm"%(nearby.name,distance(origin,nearby)))
考虑产生元组:
defin_range_with_dist_sq(origin,range,things):range_sq=range**2forthinginthings:dist_sq=distance_sq(origin,thing)ifdist_sq<=range_sq:yield(thing,dist_sq)
如果您可能链接范围检查('找到靠近X且在Nm内的东西',因为您不必再次计算距离),这可能特别有用。
但是,如果我们正在搜索一个非常大的things列表,我们预计其中很多都不值得考虑呢?
实际上有一个非常简单的优化:
defin_range_all_the_things(origin,range,things):range_sq=range**2forthinginthings:dist_sq=(origin.x-thing.x)**2ifdist_sq<=range_sq:dist_sq+=(origin.y-thing.y)**2ifdist_sq<=range_sq:dist_sq+=(origin.z-thing.z)**2ifdist_sq<=range_sq:yieldthing
这是否有用将取决于“事物”的大小。
defin_range_all_the_things(origin,range,things):range_sq=range**2iflen(things)>=4096:forthinginthings:dist_sq=(origin.x-thing.x)**2ifdist_sq<=range_sq:dist_sq+=(origin.y-thing.y)**2ifdist_sq<=range_sq:dist_sq+=(origin.z-thing.z)**2ifdist_sq<=range_sq:yieldthingeliflen(things)>32:forthingsinthings:dist_sq=(origin.x-thing.x)**2ifdist_sq<=range_sq:dist_sq+=(origin.y-thing.y)**2+(origin.z-thing.z)**2ifdist_sq<=range_sq:yieldthingelse:...just calculate distanceandrange-check it...
再次,考虑让dist_sq产生。 然后我们的热狗示例变为:
# Chaining generatorsinfo=in_range_with_dist_sq(origin,walking_distance,hotdog_stands)info=(stand,dist_sq**0.5forstand,dist_sqininfo)forstand,distininfo:print("%s %.2fm"%(stand,dist))
python 欧氏距离_python - 如何用NumPy计算欧氏距离?相关推荐
- python 欧氏距离_如何用NumPy计算欧氏距离?
对于任何对同时计算多个距离感兴趣的人,我做了一些比较完成图(我的一个小项目).结果证明a_min_b = a - b numpy.sqrt(numpy.einsum('ij,ij->i', a_ ...
- python 移动平均值_python - 如何使用NumPy计算移动平均值? - 堆栈内存溢出
这里有各种方法以及一些基准. 最好的方法是使用来自其他库的优化代码的版本. bottleneck.move_mean方法可能是最好的方法. scipy.convolve方法也非常快速,可扩展,并且在语 ...
- python求移动平均_如何用NumPy计算移动平均值?
NumPy缺少特定于域的函数可能是由于核心团队的纪律性和对NumPy主指令的忠实性:提供了N维数组类型,以及创建和索引这些数组的函数.像许多基本目标一样,这个目标并不小,纽比做得很出色. 更大的Sci ...
- matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释
总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Python.所以本文作为一个记录&笔记,文章内容大多数取自网络以&官网快速入门等, ...
- python求协方差矩阵_用numpy计算协方差(covariance)
numpy.cov函数计算协方差(covariance),不过函数返回的是一个对称矩阵.协方差的数学定义如下: 协方差(covariance) numpy.cov函数在输入1D数据的时候,等于是在计算 ...
- python 标量_python – 什么是numpy中的“标量”?
NumPy标量是任何对象,它是一个实例为 np.generic或其类型为np.ScalarType: In [12]: np.ScalarType Out[13]: (int, float, comp ...
- python公式计算_Python Numpy计算各类距离的方法
详细: 1.闵可夫斯基距离(Minkowski Distance) 2.欧氏距离(Euclidean Distance) 3.曼哈顿距离(Manhattan Distance) 4.切比雪夫距离(Ch ...
- Python:计算欧氏距离的三种写法
使用列表List作为样本点表示的欧氏距离计算方法: import math # 计算两点之间的距离 def eucliDist(A,B):return math.sqrt(sum([(a - b)** ...
- Python 计算欧氏距离
计算两个点的欧式聚类,在Python里我们可以通过numpy 这个轮子实现 假设有两个List,或者元组的元素 a=[1,2,3] b=[3,4,5] 这个时候我们是需要把这两个元素转换成array的 ...
最新文章
- d3.js图表_如何使用D3.js建立历史价格图表
- Sort Colors leetcode java
- 学习Kotlin(四)对象与泛型
- Docker的安装和使用及dockerfile简单使用
- 【线上直播】LiveVideoStack Meet | 长沙:多媒体与广电
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...
- 敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
- Wince6.0编译错误经验总结
- 【HihoCoder - 1269】 优化延迟 (优先队列+二分优化)
- java上传csv文件上传_java处理csv文件上传示例详解
- [java] byte不能直接相加
- PE知识复习之PE的各种头属性解析
- bootstraptable 怎么在特定行添加数据_手把手教你做一个“渣”数据师,用Python代替老情人Excel...
- Oracle 宣布 Java EE 8 推迟到2017年年底发布
- 51单片机-直流电机
- offer收割者!Alibaba内部独家MySQL优化宝典横空出世,再也不用担心被面试官拦路了
- Z05 - 033、访客分析 - 独立访客
- 渗透测试职业规划-三省吾身
- android图形框架之surfaceflinger分析(一)
- ORB-SLAM2工作原理总结
热门文章
- 大坝安全监测系统是由什么组成的?
- Beyond Compare4提示过期解决办法
- 近红外光谱建模之光谱预处理python实现(一)
- QT5.6 MSVC编译器 实现-海康摄像头,获取H.264裸码流并通过libmp4V2实现MP4写封装生成MP4视频文件
- Problem C. 狙击敌人
- 仿个人税务 app html5_注意,你下载的可能是个假的个税App
- HTML新年祝福抽奖小游戏,春节祝福抽奖小游戏代码
- vue 项目npm run dev时报错The service was stopped
- html引用本地html页面,怎么引用jquery?
- 重庆大学李婷婷计算机学院,计算机学院成立平安校园巡查队的通知