2017-01-18 4 views
3

私はペアワイズ距離と自分のデータ(X、Y、Z)の残差を計算するコードを持っています。データはかなり大きく(平均7000行)、私の興味はコード効率です。私の最初のコードはこれを下回ることは非常に良い作品、私は次のようにそれを変更し、pwdistanceペアワイズ距離と残差計算の最適化

import tkinter as tk 
from tkinter import filedialog 
import pandas as pd 
import, numpy as np 
from scipy.spatial.distance import pdist, squareform 

root = tk.Tk() 
root.withdraw() 
file_path = filedialog.askopenfilename() 

data = pd.read_excel(file_path) 
data = np.array(data, dtype=np.float) 
npoints, cols = data.shape 

pwdistance = np.zeros((npoints, npoints)) 
pwresidual = np.zeros((npoints, npoints)) 
for i in range(npoints): 
    for j in range(npoints): 
     pwdistance[i][j] = np.sqrt((data[:,0][i]-data[:,0][j])**2 + (data[:,1][i]-data[:,1][j])**2) 
     pwresidual[i][j] = (data[:,2][i]-data[:,2][j])**2 

です。

pwdistance = squareform(pdist(data[:,:2])) 

pwresidualを計算するニシキヘビの方法はありますので、私はループを使用し、より高速に実行するために自分のコードを有効にする必要はありませんか?

+0

あなたが代わりに 'np.sqrt'と' **の 'np.hypot'を使用することができ2' –

+0

@FranciscoCouzo OPは '' pwresidual'を取得/最適化するよう求めているようです。私はそれもあまりにも初めて混乱した:) – Divakar

+0

@Divakarそれは私が答えの代わりにコメントを作った理由です:) –

答えて

1

2Dアレイを形成し、それから1Dスライスを減算するために、第2の列スライスの寸法をdataに拡張することが1つの方法である。これらの減算は、broadcastingの規則に従ってベクトル化された方法で実行される。

はこのように、単純に行う -

pwresidual = (data[:,2,None] - data[:,2])**2 

ステップ・バイ・ステップの実行 -

In [132]: data[:,2,None].shape # Slice extended to a 2D array 
Out[132]: (4, 1) 

In [133]: data[:,2].shape # Slice as 1D array 
Out[133]: (4,) 

In [134]: data[:,2,None] - data[:,2] # Subtractions with broadcasting 
Out[134]: 
array([[ 0.  , 0.67791602, 0.13298141, 0.61579315], 
     [-0.67791602, 0.  , -0.54493461, -0.06212288], 
     [-0.13298141, 0.54493461, 0.  , 0.48281174], 
     [-0.61579315, 0.06212288, -0.48281174, 0.  ]]) 

In [137]: (data[:,2,None] - data[:,2]).shape # Verify output shape 
Out[137]: (4, 4) 

In [138]: (data[:,2,None] - data[:,2])**2 # Finally elementwise square 
Out[138]: 
array([[ 0.  , 0.45957013, 0.01768406, 0.3792012 ], 
     [ 0.45957013, 0.  , 0.29695373, 0.00385925], 
     [ 0.01768406, 0.29695373, 0.  , 0.23310717], 
     [ 0.3792012 , 0.00385925, 0.23310717, 0.  ]]) 
関連する問題