2017-01-20 32 views
0

我正在基於數據窗體中的每個點與其他點的角度對數據進行排序。對於我的給定data(X,Y,Z)中,i計算成對距離(pwdist),成對值(pwresi)和一對數據點之間(pwang)的角度。一旦我得到這個,我通過查看數據的索引和相應的角度將數據分組到不同的類(通過從0到180的角度定義,步長爲30)。然後,對於每個班級,我估計方差/半方差。爲了清楚起見,我增加了我下面的代碼:高效排序和分組真的很大陣列

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點的數據,所以時間至關重要。有沒有一種高效/ pythonic的方式來編寫這些代碼來提高性能?

回答

0

說實話,你的代碼凌亂,你的問題是沒有完全理解。

所以我的答案是理論上的,你應該把它應用到你自己的情況:

考慮,一個列表: myList = [element1, element2, element3]

和已知的評價函數:def eval(a): return angle(a.x, a.y)例如

你可以使用快速排序python(我認爲它們使用快速排序),它是O(n * log(n))來排序它,通過這樣做:

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

此方法爲列表中每個可排序的元素分配一個數值。