2016-07-04 11 views
0

このループユークリッド距離計算を最適化するスマートな方法を見ています。この計算は、他のすべてのベクトルからの平均距離を求めています。ループスケルトンユークリッド距離最適化

私のベクトル配列は本当に大きいので、eucl_dist = euclidean_distances(eigen_vs_cleaned) 行ごとにループを実行しています。

典型的なeigen_vs_cleanedの形状は、現時点で少なくとも300000,1000であり、私はもっと上がっていく必要があります。 (2000000,10000のような)

もっとスマートな方法はありますか?

eucl_dist_meaned = np.zeros(eigen_vs_cleaned.shape[0],dtype=float) 

from sklearn.metrics.pairwise import euclidean_distances 
for z in range(eigen_vs_cleaned.shape[0]): 
    if z%10000==0: 
     print(z) 
    eucl_dist_temp = euclidean_distances(eigen_vs_cleaned[z].reshape(1, -1), eigen_vs_cleaned) 
    eucl_dist_meaned[z] = eucl_dist_temp.mean(axis=1) 

答えて

0

いいえpython/numpy guruしかし、これは私がこれを最適化した最初のステップです。それは私のMacPro上で少なくとも良い方法を実行します。

from joblib import Parallel, delayed 
import multiprocessing 
import os 
import tempfile 
import shutil 

from sklearn.metrics.pairwise import euclidean_distances 

# Creat a temporary directory and define the array pat 
path = tempfile.mkdtemp() 
out_path = os.path.join(path,'out.mmap') 
out = np.memmap(out_path, dtype=float, shape=eigen_vs_cleaned.shape[0], mode='w+') 

eucl_dist_meaned = np.zeros(eigen_vs_cleaned.shape[0],dtype=float) 

num_cores = multiprocessing.cpu_count() 

def runparallel(row, out): 
    if row%10000==0: 
     print(row) 
    eucl_dist_temp = euclidean_distances(eigen_vs_cleaned[row].reshape(1, -1), eigen_vs_cleaned) 
    out[row] = eucl_dist_temp.mean(axis=1) 
    ## 

nothing = Parallel(n_jobs=num_cores)(delayed(runparallel)(r, out) for r in range(eigen_vs_cleaned.shape[0])) 

それから私は、出力を保存:

eucl_dist_meaned = np.array(out,copy=True,dtype=float)