我正在基於數據窗體中的每個點與其他點的角度對數據進行排序。對於我的給定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的方式來編寫這些代碼來提高性能?