Сортировка контейнеров в Python / Numpy - PullRequest
1 голос
/ 23 июля 2011

Мне нужно отсортировать специальный массив NumPy, в котором блоки размером 19 составляют элемент, используя определяемую пользователем функцию для определения значения такого блока.

Первая попытка заключалась в переносемассив в классе и перегрузить оператор []:

class W:
    def __init__(self, filename="nn.txt"):
        self.nn = array([int(i) for i in open(filename, "r").readlines()[1:]])
        self.size = self.nn.size / 19

    def __getitem__(self, idx):
        return self.nn[idx:idx+19] 

    def __len__(self):
            return self.size

Используя эту структуру, я предоставляю оператор сравнения, который передается в sorted ():

def avg_cmp(x, y):
   return int(average(x)) - int(average(y))

u = W("nnsmall.txt")
sorted(u, cmp=avg_cmp)

Однако этоподход слишком медленный.

Есть советы?

1 Ответ

4 голосов
/ 23 июля 2011

вы пробовали sorted(u, key=average)? это будет рассчитывать среднее значение каждого столбца только один раз.

если размер массива всегда делится на 19 без остатка:

>>> import numpy as np
>>> n = 2
>>> u = np.array([v for v in range(19*n)])

>>> u = u.reshape(n,19)

>>> sorted(c, key=np.average)

[array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18]),
 array([19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...