【问题标题】:Efficiently sorting and grouping really big arrays有效地对非常大的数组进行排序和分组
【发布时间】:2017-06-05 14:51:53
【问题描述】:

我正在根据数据中每个点与其他点形成的角度对数据数组进行排序。对于我给定的data (x,y,z),我计算成对距离 (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 的方式来编写此代码以提高性能?

【问题讨论】:

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


    【解决方案1】:

    说实话,你的代码很乱,你的问题也不是完全可以理解的。

    所以我的回答是理论上的,你应该把它应用到你自己的案例中:

    给定一个列表: 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))

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

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2021-07-10
      • 2011-08-01
      相关资源
      最近更新 更多