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, на подгруппы элементов больших и меньших указанных элементов.
Замечание
Данная функция обладает эквивалентным методом класса 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])