2014-01-10 3 views
2

У меня есть данные, что выглядит этойNumpy, сортировка на основе столбца дважды

[[361 2 2] 
[259 4 3] 
[ 361 6 5] 
[ 259 8 5] 
... 
] 

В исходных данных, то первый столбец люди идентификатор, второй столбец тест идентификатор и третий знак (к примеру).

Я хочу, чтобы создать Numpy массив, который сортирует как этот

[ 
[score_for_test_id_0_for_person_0, score_for_test_id_1_for_person_0, score_for_test_id_2_for_person_0 ], 
[score_for_test_id_0_for_person_1, score_for_test_id_1_for_person_1, score_for_test_id_2_for_person_1 ] 
] 

Длина new_array будет количество людей. Каждый элемент нового массива будет таким, как [score_for_test_id_0, score_for_test_id_1, score_for_test_id_n]

Я бы знал, как это сделать в обычном Python, но это будет полностью неэффективно, я не уверен, как это сделать в Numpy, хотя ,

+3

Я предлагаю вам взглянуть на [панда] (http://pandas.pydata.org/) – BrenBarn

+0

Я смущен о вашем выходе. Можете ли вы описать (на словах), как вы пришли к этому результату? – mgilson

+0

Итак, каждая строка нового массива представляет человека, и внутри каждой строки находятся оценки для каждого из их тестов, отсортированных из теста ids от самого маленького до наибольшего [оценка для теста 0, оценка для теста 1, оценка для теста 2, .. ect.] Пожалуйста, дайте мне знать, если возникнут вопросы –

ответ

0

Вычислив сумму personId и normalized testId. Мы можем использовать это как наш ключ сортировки. Таким образом, мы получаем сортировку с приоритетом personId и testId. Значения SortKey будет от PersonId + (0,1]

import numpy as np 

data = [[361, 4, 1], 
     [259, 3, 2], 
     [361, 2, 3], 
     [259, 1, 4]] 
data = np.array(data) 
persons = data[:,0] 
testIds = data[:,1] 
sortKey = persons + 1.0*testIds/max(testIds) 

data = data[np.argsort(sortKey)] 

#If this is not the same for everyone this will not be possible with numpy 
testsPerPerson = np.count_nonzero(data[:,0][data[:,0] == data[0,0]]) 

scores = data[:,-1].reshape(testsPerPerson, data.shape[0]/testsPerPerson) 

Выход:.

In [248]: data # After sorting 
Out[248]: 
array([[259, 1, 4], 
     [259, 3, 2], 
     [361, 2, 3], 
     [361, 4, 1]]) 

In [247]: scores 
Out[247]: 
array([[4, 2], 
     [3, 1]]) 
+0

Значит, это действительно невозможно? –

+0

Нет, совсем не нужно просто думать о лучшем способе сортировки. Посмотреть последнее редактирование – M4rtini

0

Было бы здорово, если бы вы могли предоставить минимальный набор данных и ожидаемый результат, но из вашего описания, если ваш человек и идентификатор теста являются целыми целыми числами начиная с 0, и у вас нет повторной пары «человек-тест», вы может просто сделать:

people, tests = np.max(data[:, :2], axis=0) 
sorted_scores = np.zeros((people, tests)) 
sorted_scores[data[0], data[1]] = data[2] 

Если они не являются последовательными целыми числами, подобный подход может быть сделано для работы, с парой звонков в np.unique с return_inverse=True.

+0

Прохладный! но я не слишком хорошо знаком с numpy (все еще изучая), как бы реализовать эти вызовы? –

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