簡體   English   中英

優化距離矩陣計算

[英]Optimize a distance matrix calculation

我試圖從前兩個分量的傅立葉變換計算矩陣距離。 矩陣是 40k x 40k,我這樣做的方式非常慢。 有沒有一種計算矩陣更高效更快的方法?

import numpy as np
from scipy.linalg import dft

#Transform the data using Fourier Transform.
ft = norm_data.dot(dft(8).transpose())/sqrt(8)

def ft_distance_calc(x,y):
    temp = np.zeros((x,y))
    for i in range(x):
        for z in range(y):
            temp[i,z] = sqrt(np.square(abs(ft[i,0:2] - ft[z,0:2])).sum())
    return temp

ft_distance = ft_distance_calc(40000,40000) 

廣播怎么樣

def dist_cal(x,y):
    return np.sqrt(np.square(ft[:x,None, :2]-ft[None, :y, :2]).sum(-1))

# test
a = ft_distance_calc(400,200)
b = dist_cal(400,200)

(np.abs(a-b) < 1e-6).all()
# True

您可以為它使用內置函數:

from scipy.spatial.distance import cdist
def ft_distance_calc_2(x,y):
    return cdist(ft[:x,0:2],ft[:y,0:2])

使用benchit比較

#OP's solution
def ft_distance_calc(x,y):
    temp = np.zeros((x,y))
    for i in range(x):
        for z in range(y):
            temp[i,z] = np.sqrt(np.square(abs(ft[i,0:2] - ft[z,0:2])).sum())
    return temp

#@Ehsan's solution
def ft_distance_calc_2(x,y):
    return cdist(ft[:x,0:2],ft[:y,0:2])

#@Quang's solution
def dist_cal(x,y):
    return np.sqrt(np.square(ft[:x,None, :2]-ft[None, :y, :2]).sum(-1))

ft = np.random.rand(1000,2)
in_ = {n:[n, n] for n in [10,100,1000]}

似乎ft_distance_calc_2是最快的。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM