2015-05-03 3 views
1

numpy.partition() также сортирует внутренние элементы массива.numpy.partition() с 2-D Array

Я пытаюсь выполнить простую сортировку на основе первого элемента всех элементов массива.

import numpy as np 
a = np.array([[5.2, 4.3], [200.2, 6.2], [1.4, 112.2]]) 
np.partition(a, (1,a.shape[1]-1), axis = 1) 

Выход:

array([[ 4.3, 5.2], 
     [ 6.2, 200.2], 
     [ 1.4, 112.2]]) 

Я не понять работу np.partition() здесь. Любые ресурсы для подробностей на numpy.partition()?

В частности, я хочу изменить аргументы метода сгенерирует следующий вывод:

array([[ 1.4, 112.2], 
     [ 5.2, 4.3], 
     [ 200.2, 6.2]]) 

ответ

2

Если я правильно понимаю, вы просто хотите отсортировать строки в своем массиве в соответствии со значениями в первом столбце. Вы можете сделать это с помощью np.argsort:

# get an array of indices that will sort the first column in ascending order 
order = np.argsort(a[:, 0]) 

# index into the row dimension of a 
a_sorted = a[order] 

print(a_sorted) 
# [[ 1.4 112.2] 
# [ 5.2 4.3] 
# [ 200.2 6.2]] 

Если вы хотите частичный вид, а не полный вид, вы можете использовать np.argpartition во многом таким же образом:

# a slightly larger example array in order to better illustrate what 
# argpartition does 
b = np.array([[ 5.2, 4.3], 
       [200.2, 6.2], 
       [ 3.6, 85.1], 
       [ 1.4, 112.2], 
       [ 12.8, 60.0], 
       [ 7.6, 23.4]]) 

# get a set of indices to reorder the rows of `b` such that b[2, 0] is in its 
# final 'sorted' position, and all elements smaller or larger than it will be 
# placed before and after it respectively 
partial_order = np.argpartition(b[:, 0], 2) 

# the first (2+1) elements in the first column are guaranteed to be smaller than 
# the rest, but apart from that the order is arbitrary 
print(b[partial_order]) 
# [[ 1.4 112.2] 
# [ 3.6 85.1] 
# [ 5.2 4.3] 
# [ 200.2 6.2] 
# [ 12.8 60. ] 
# [ 7.6 23.4]] 
+0

Могу ли я сделать то же самое с методом numpy.partition(). Причина в том, что у меня есть набор данных около 18000 строк, и я хочу разбить это. Но этот метод разделения - это перетасовка значений. – user2831683

+0

Если вы хотите частично отсортировать первый столбец, вы можете использовать ['np.argpartition'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.argpartition.html) на месте 'np.argsort' в моем примере выше. –

3

np.partition() гарантирует, что значения в отдельных индексов являются такими же, как если бы массив должны были быть полностью отсортирован (например, с np.sort). (Порядок значений по другим индексам не гарантируется ничем значимым.)

Аргумент axis=1 означает, что эта операция будет применяться индивидуально для каждой строки.

Здесь индексы, которые вы прошли, составляют (1, a.shape[1]-1), что в данном случае эквивалентно (1, 1). Повторение индекса не имеет особого значения, поэтому в каждой строке значение во втором столбце (индекс 1) будет таким же, как если бы каждая строка находилась в отсортированном порядке.

Теперь, когда операция применяется, в возвращаемом массиве вы видите, что более высокие значения в первой и второй строках были перенесены в этот второй столбец. Третья строка уже была в упорядоченном порядке и поэтому не изменилась.

Это действительно все, что касается функции: NumPy documentation охватывает несколько дополнительных деталей. Если вы чувствуете себя особенно смело, вы можете найти исходный код, реализующий алгоритм introselect, используемый np.partition() во всей красе here.

+0

я могу остановить упорядочение внутренних элементов , выполняемый методом. – user2831683

+0

Я не совсем уверен, что вы имеете в виду - можете ли вы уточнить? –

+0

Я отредактировал вопрос, а точнее – user2831683