我想用各种性能说明来阐述简单的答案。 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计算欧氏距离?相关推荐

  1. python 欧氏距离_如何用NumPy计算欧氏距离?

    对于任何对同时计算多个距离感兴趣的人,我做了一些比较完成图(我的一个小项目).结果证明a_min_b = a - b numpy.sqrt(numpy.einsum('ij,ij->i', a_ ...

  2. python 移动平均值_python - 如何使用NumPy计算移动平均值? - 堆栈内存溢出

    这里有各种方法以及一些基准. 最好的方法是使用来自其他库的优化代码的版本. bottleneck.move_mean方法可能是最好的方法. scipy.convolve方法也非常快速,可扩展,并且在语 ...

  3. python求移动平均_如何用NumPy计算移动平均值?

    NumPy缺少特定于域的函数可能是由于核心团队的纪律性和对NumPy主指令的忠实性:提供了N维数组类型,以及创建和索引这些数组的函数.像许多基本目标一样,这个目标并不小,纽比做得很出色. 更大的Sci ...

  4. matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释

    总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Python.所以本文作为一个记录&笔记,文章内容大多数取自网络以&官网快速入门等, ...

  5. python求协方差矩阵_用numpy计算协方差(covariance)

    numpy.cov函数计算协方差(covariance),不过函数返回的是一个对称矩阵.协方差的数学定义如下: 协方差(covariance) numpy.cov函数在输入1D数据的时候,等于是在计算 ...

  6. python 标量_python – 什么是numpy中的“标量”?

    NumPy标量是任何对象,它是一个实例为 np.generic或其类型为np.ScalarType: In [12]: np.ScalarType Out[13]: (int, float, comp ...

  7. python公式计算_Python Numpy计算各类距离的方法

    详细: 1.闵可夫斯基距离(Minkowski Distance) 2.欧氏距离(Euclidean Distance) 3.曼哈顿距离(Manhattan Distance) 4.切比雪夫距离(Ch ...

  8. Python:计算欧氏距离的三种写法

    使用列表List作为样本点表示的欧氏距离计算方法: import math # 计算两点之间的距离 def eucliDist(A,B):return math.sqrt(sum([(a - b)** ...

  9. Python 计算欧氏距离

    计算两个点的欧式聚类,在Python里我们可以通过numpy 这个轮子实现 假设有两个List,或者元组的元素 a=[1,2,3] b=[3,4,5] 这个时候我们是需要把这两个元素转换成array的 ...

最新文章

  1. d3.js图表_如何使用D3.js建立历史价格图表
  2. Sort Colors leetcode java
  3. 学习Kotlin(四)对象与泛型
  4. Docker的安装和使用及dockerfile简单使用
  5. 【线上直播】LiveVideoStack Meet | 长沙:多媒体与广电
  6. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...
  7. 敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
  8. Wince6.0编译错误经验总结
  9. 【HihoCoder - 1269】 优化延迟 (优先队列+二分优化)
  10. java上传csv文件上传_java处理csv文件上传示例详解
  11. [java] byte不能直接相加
  12. PE知识复习之PE的各种头属性解析
  13. bootstraptable 怎么在特定行添加数据_手把手教你做一个“渣”数据师,用Python代替老情人Excel...
  14. Oracle 宣布 Java EE 8 推迟到2017年年底发布
  15. 51单片机-直流电机
  16. offer收割者!Alibaba内部独家MySQL优化宝典横空出世,再也不用担心被面试官拦路了
  17. Z05 - 033、访客分析 - 独立访客
  18. 渗透测试职业规划-三省吾身
  19. android图形框架之surfaceflinger分析(一)
  20. ORB-SLAM2工作原理总结

热门文章

  1. 大坝安全监测系统是由什么组成的?
  2. Beyond Compare4提示过期解决办法
  3. 近红外光谱建模之光谱预处理python实现(一)
  4. QT5.6 MSVC编译器 实现-海康摄像头,获取H.264裸码流并通过libmp4V2实现MP4写封装生成MP4视频文件
  5. Problem C. 狙击敌人
  6. 仿个人税务 app html5_注意,你下载的可能是个假的个税App
  7. HTML新年祝福抽奖小游戏,春节祝福抽奖小游戏代码
  8. vue 项目npm run dev时报错The service was stopped
  9. html引用本地html页面,怎么引用jquery?
  10. 重庆大学李婷婷计算机学院,计算机学院成立平安校园巡查队的通知