亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在計算歐幾里得距離時,按列計算比在 Pandas 中的整個 DataFrame 上計算更快

為什么在計算歐幾里得距離時,按列計算比在 Pandas 中的整個 DataFrame 上計算更快

慕容708150 2022-05-19 15:30:32
我有一個熊貓系列,其中包含點p的x和y坐標,以及一個包含多個點q 1到q n(也是x和y)的 DataFrame。然后我計算p和每個qs之間的成對歐幾里得距離。我嘗試了幾種計算方法,試圖找到最有效的一種,其中兩種引起了我的注意:import pandas as pdcs = pd.DataFrame([[10, 15], [56, 45], [33, 24]], columns=['x', 'y'])pt = pd.Series({'x': 14, 'y': 32})def d1(cls, pt):    return ((pt['x'] - cls['x']) ** 2 + (pt['y'] - cls['y']) ** 2) ** 0.5def d2(cls, pt):    return ((pt - cls) ** 2).sum(axis=1) ** 0.5第一個,d1,分別減去和平方x和y列然后將它們相加,而同時d2減去兩列進行減法,然后.sum()將它們相加。我預計d2會更快,但是當同時使用timeit這兩個函數時(7 次運行,每個 1000 次循環),我發現這比(690 毫秒對 1.9 秒)d1快了近三倍。d2這可能是什么原因?
查看完整描述

1 回答

?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

性能較差的原因d2是組織數據框操作(索引檢查對齊等)的額外開銷。雖然我無法解釋每個細節,但您將從d1和d2的配置文件圖表中獲得基本概念.


d1和之間的差異d2會隨著維度的增加而變?。涸谖业臋C器上,2、3 和 4 維度的d2/d1執行時間比率分別為 2.6、2.1 和 1.8。所以我想足夠多的維度d2可能會比d1(未測試)更快。


計算歐幾里得距離的最快方法是使用cdistfrom SciPy:


from scipy.spatial import distance


def d3(cls, pt):

    return pd.Series(distance.cdist(cls, [pt]).ravel())

它至少比維數快 5 倍,d1并且實際上不依賴于維數。以下是2、3 和 4 維的timeit輸出d1:d2d3


2D

1000 loops, best of 3: 1.37 ms per loop

100 loops, best of 3: 3.61 ms per loop

1000 loops, best of 3: 246 μs per loop

3D

100 loops, best of 3: 2.05 ms per loop

100 loops, best of 3: 4.28 ms per loop

1000 loops, best of 3: 234 μs per loop

4D

100 loops, best of 3: 2.69 ms per loop

100 loops, best of 3: 5.06 ms per loop

1000 loops, best of 3: 237 μs per loop

d1從原始 2D 案例的性能圖中可以看出,隨著數據幀大小的增加,和之間的差異d2也會變?。?/p>

http://img1.sycdn.imooc.com//6285f23f0001649103960268.jpg

查看完整回答
反對 回復 2022-05-19
  • 1 回答
  • 0 關注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號