有效地对真正大的数组进行排序和分组

时间:2017-01-20 15:05:50

标签: python performance python-3.x sorting numpy

我根据数据形式中每个点与其他点的角度对数据数组进行排序。对于我给定的data(x,y,z),我计算成对距离(pwdist),成对值(pwresi)和对数据点之间的角度({{1 }})。一旦我得到这个,我通过查看数据的索引及其相应的角度将数据分组到各种类别(由角度范围从0到180,步长为30)。然后对于每个班级,我估计方差/半方差。为清楚起见,我在下面添加了我的代码:

pwang

代码工作得非常好,直到我必须将数据分组到类中(即代码中,来自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])) )。对于少于500点的数据,此代码是可以的。但我运行的数据超过10,000点,所以时间至关重要。是否有一种高效/ pythonic方式来编写此代码以提高性能?

1 个答案:

答案 0 :(得分: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))

此方法为列表中的每个元素分配一个数值,该值可以排序。