2017-01-20 2 views
0

Я сортирую массив данных на основе угла каждой точки в формах данных с другими точками. Для моих заданных 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 пунктов, и поэтому время имеет решающее значение. Есть ли эффективный/питонический способ написать этот код для повышения производительности?

ответ

0

Если честно, ваш код беспорядочен, и ваш вопрос не совсем понятен.

Так что мой ответ является теоретическим, и вы должны применить его к собственному делу:

Учитывая, список: myList = [element1, element2, element3]

И известно, функция оценки: def eval(a): return angle(a.x, a.y) например

You может использовать только быстрый тип python (я думаю, что они используют quick-sort), который является O (n * log (n)), чтобы отсортировать его, выполнив:

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

Этот метод присваивает числовое значение для каждого из элементов в списке, который можно сортировать.

Смежные вопросы