2017-01-20 19 views
0

データ形式内の各点と他の点との角度に基づいてデータの配列をソートしています。与えられたdata(x、y、z)に対して、私はペアワイズ距離(pwdist)、ペアワイズ値(pwresi)、ペアデータポイント間の角度(pwang)を計算します。私がこれを取得すると、データのインデックスとそれに対応する角度を調べることによって、データをさまざまなクラス(30のステップで0〜180の範囲の角度で定義)にグループ化します。次に、各クラスについて、分散/半分散を推定します。明確にするために、私は以下の私のコードを追加しました:本当に大きな配列を効率的にソートしてグループ化する

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

root = tk.Tk() 
root.withdraw() 
filepath = filedialog.askopenfilename() 
data = pd.read_excel(filepath) 
data = np.array(data, dtype=np.float) 
nrow, dummy_cols = data.shape 

pwdist = squareform(pdist(data[:,:2])) 
pwresi = (data[:,2, None] - data[:,2])**2 
pwang = np.arctan2((data[:,1, None] - data[:,1]), (data[:,0, None] - data[:,0]))*180/np.pi 

vecdistance = pwdist.ravel() 
vecresidual = pwresi.ravel() 
vecangle = pwang.ravel() 

sortdistance = defaultdict(list) 
sortresidual = defaultdict(list) 
sortangle = defaultdict(list) 
lagangle = [] 
count = -1 
get_anglesector = 30 

for j in range(0, 180, get_anglesector): 
    count += 1 
    for k, dummy_val in enumerate(vecangle): 
     if j <= vecangle[k] < j + get_anglesector: 
      sortdistance[count].append(vecdistance[k]) 
      sortresidual[count].append(vecresidual[k]) 
      sortangle[count].append(vecangle[k]) 
    lagangle.append((j+get_anglesector/2)) 

uniquedistance = {} 
classdistance = {} 
summation = {} 
semivariance = {} 

for i, dummy_val in enumerate(sortdistance): 
    uniquedistance[i] = np.unique(sortdistance[i]) 
    classdistance[i] = np.searchsorted(uniquedistance[i], sortdistance[i]) 
    summation[i] = np.bincount(classdistance[i], weights=sortresidual[i]) 
    semivariance[i] = summation[i]/(2*np.bincount(classdistance[i])) 

コードがグループに私が持っているときまで、非常によく機能したクラスにデータを(つまり、コード内で、for j in range(0, 180, get_anglesector):から)。 500ポイント未満のデータの場合、このコードは大丈夫です。しかし、私は10,000ポイント以上のデータを実行しているので、時間が重要です。パフォーマンスを向上させるために、このコードを書くための効率的な/ pythonの方法がありますか?

答えて

0

正直なところ、あなたのコードは面倒です。あなたの質問は完全に理解できません。

だから私の答えは、理論的で、そしてあなたがあなた自身のケースに適用する必要があります考える

、リスト: myList = [element1, element2, element3]

と既知の、評価関数:def eval(a): return angle(a.x, a.y)例えば

あなたは(O(n * log(n)))を使ってソートすることで、高速ソートpythonを使用することができます(クイックソートを使用すると思います)。

sortedList = mylist.sort(key=lambda a: angle(a.x, a.y))

このメソッドは、ソート可能なリスト内の各要素に数値を割り当てます。

関連する問題