numpy和scipy计算向量欧氏距离性能对比

# coding:utf-8

from scipy import spatial
from functools import wraps
import datetime
import numpy as np


def print_execution_time(func, iter=100):
    @wraps(func)
    def warpper(*args, **kwargs):
        total_time = 0
        for i in range(iter):
            start_time = datetime.datetime.now()
            res = func(*args, **kwargs)
            end_time = datetime.datetime.now()
            duration_time = (end_time - start_time).microseconds // 1000
            total_time += duration_time
        avg_time = total_time / iter
        print("function name -> %s, elapse time -> %s ms" % (func.__name__, avg_time))
        return res

    return warpper


@print_execution_time
def distance_euclidean_numpy(vec1, vec2):
    return np.sqrt(np.sum(np.power(vec1 - vec2, 2), axis=1))


@print_execution_time
def distance_euclidean_scipy(vec1, vec2, distance="euclidean"):
    return spatial.distance.cdist(vec1, vec2, distance)


x = np.random.rand(1000000).reshape((-1, 2)) * 100
x = x.astype(np.int16)

# print(x.dtype, x.shape)
y = np.array([[1, 2]])

print("starting")

distance_numpy = distance_euclidean_numpy(x, y)
distance_scipy = distance_euclidean_scipy(x, y, "euclidean")
print(distance_numpy[500:510])
print(distance_scipy[500:510])

输出结果:

starting
function name -> distance_euclidean_numpy, elapse time -> 24.62 ms
function name -> distance_euclidean_scipy, elapse time -> 10.21 ms
[ 53.60037313  50.28916384  77.62087348  52.63078947  47.38143096
  75.16648189 113.27841807 101.67103816 118.1058847   65.8559033 ]
[[ 53.60037313]
 [ 50.28916384]
 [ 77.62087348]
 [ 52.63078947]
 [ 47.38143096]
 [ 75.16648189]
 [113.27841807]
 [101.67103816]
 [118.1058847 ]
 [ 65.8559033 ]]


结论:scipy计算性能更高

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html

欧氏距离是最常用和直观的距离度量方法之一,用于衡量两个点在空间中的距离。在Python中,有几种方法可以计算欧氏距离。 方法一:根据公式求解。可以使用NumPy库来计算欧氏距离。首先,我们需要导入NumPy库。然后,将两个向量x和y定义为NumPy数组。接下来,可以使用np.sqrt(np.sum(np.square(x-y)))来计算欧氏距离。 方法二:根据scipy库求解。可以使用SciPy库的pdist函数来计算欧氏距离。首先,我们需要导入SciPy库的pdist函数。然后,将两个向量x和y组合成一个矩阵X。最后,可以使用pdist(X)来计算欧氏距离。 另外,还有其他方法可以计算欧氏距离。例如,可以使用numpy.linalg.norm函数或者自定义函数来计算欧氏距离。 示例代码如下: ```python import numpy as np # 方法一:根据公式求解 x = np.random.random(10) y = np.random.random(10) d1 = np.sqrt(np.sum(np.square(x-y))) # 方法二:根据scipy库求解 from scipy.spatial.distance import pdist X = np.vstack([x,y]) d2 = pdist(X) # 其他方法:使用numpy.linalg.norm函数 dist = np.linalg.norm(x-y) # 其他方法:使用自定义函数 def eucliDist(A,B): return np.sqrt(np.sum([(a - b)**2 for (a,b) in zip(A,B)])) X = [1,2,3,4] Y = [0,1,2,3] dist_custom = eucliDist(X,Y) print(d1) print(d2) print(dist) print(dist_custom) ``` 以上是在Python计算欧氏距离的几种方法。你可以根据具体情况选择使用哪种方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [欧氏距离(Euclidean Distance) Python 实现计算欧氏距离](https://blog.csdn.net/songhao8080/article/details/103669994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [计算Python Numpy向量之间的欧氏距离实例](https://download.csdn.net/download/weixin_38703123/13711829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python计算欧氏距离的三种写法](https://blog.csdn.net/DeniuHe/article/details/100838755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值