numpy.partition

numpy.partition(a, kth, axis=-1, kind='introselect', order=None)

Функция partition() возвращает копию исходного массива элементы которого разделены по указанному значению.

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

Параметры:
a - массив NumPy или подобный массиву объект.
Исходный массив.
kth - целое число или последовательность целых чисел.
Индекс или последовательность индексов элементов в его отсортированной копии.
axis - целое число (необязательный параметр).
Определяет ось вдоль которой выполняется разбиение элементов. Если равен None, то разбиение выполняется по сжатому до одной оси представлению исходного массива. По умолчанию axis = -1, что соответствует разбиению по последней оси массива.
kind - строка 'introselect' (необязательный параметр).
Алгоритм выборки элементов. Единственное возможное значение 'introselect'.
order - строка или список строк (необязательный параметр).
В случае, когда массив a является структурированным, и его полям присвоено имя, то данный параметр позволяет указать порядок в котором они должны учавствовать в сортировке Если указаны не все поля, то неуказанные будут использоваться в том порядке в котором они перечислены в dtype структурированного массива.
Возвращает:
ndarray - массив NumPy
разбиение исходного массива той же формы и типа данных что и a, на подгруппы элементов больших и меньших указанных элементов.
Смотрите так же:
argpartition, sort

Замечание

Данная функция обладает эквивалентным методом класса ndarray, т.е. np.partition(a) равносильно вызову метода a.partition(), но в отличие от функции данный метод не возвращает копию, а меняет исходный массив:

>>> import numpy as np
>>> 
>>> a = np.random.randint(0, 20, 10)
>>> a
array([ 3,  0,  0, 13,  6, 18,  3, 11,  1,  5])
>>> 
>>> a.partition(5)
>>> a
array([ 3,  3,  0,  1,  0,  5, 18, 11, 13,  6])

Используемый алгоритм выборки делает временную копию данных при выполнении сортировки по всем осям кроме последней, так что сортировка только по последней оси выполняется быстрее всего и занимает меньше всего места.

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

Сортировка комплексных чисел выполняется лексикографически: если действительная и мнимая часть не равна nan то сортировка выполняется по действительной части, но если действительные части равны, то порядок определяется их мнимыми частями. Расширенный порядок сортировки: [R + Rj, R + nan, nan + Rj, nan + nan], где R - действительное число.



Примеры

Для удобства мы создадим объект генератора случайных чисел и увеличим область вывода массивов:

>>> import numpy as np
>>> 
>>> rng = np.random.RandomState(0)
>>> np.set_printoptions(edgeitems = 10, linewidth = 200)

Теперь создадим массив случайных целых чисел:

>>> a = rng.randint(0, 1000, 12)
>>> a
array([684, 559, 629, 192, 835, 763, 707, 359,   9, 723, 277, 754])

Допустим, нам нужно, что бы все элементы меньшие числа 559 оказались слева, а все остальные справа:

>>> np.partition(a, 4)
array([192,   9, 277, 359, 559, 629, 707, 684, 723, 754, 835, 763])
>>> 
>>> np.sort(a)
array([  9, 192, 277, 359, 559, 629, 684, 707, 723, 754, 763, 835])

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

>>> np.partition(a, [5, 9])
array([192,   9, 277, 359, 559, 629, 707, 684, 723, 754, 835, 763])

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

>>> b = np.partition(a, 6)
>>> b[:6]
array([192,   9, 277, 359, 559, 629])
>>> 
>>> b[6:]
array([684, 707, 723, 754, 835, 763])