Как работает аргумент numpy на примере документации? - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь понять функцию argpartition numpy.Я сделал пример документации как можно более простым.

import numpy as np

x = np.array([3, 4, 2, 1])
print("x: ", x)

a=np.argpartition(x, 3)
print("a: ", a)

print("x[a]:", x[a])

Это вывод ...

('x: ', array([3, 4, 2, 1]))
('a: ', array([2, 3, 0, 1]))
('x[a]:', array([2, 1, 3, 4]))

В строке a = np.argpartition (x, 3) не является ли k-й элемент последним элементом (число 1)?Если это номер 1, то при сортировке x не должен ли 1 стать первым элементом (элемент 0)?

В x [a], почему 2 - это первый элемент "перед" 1?

Какую фундаментальную вещь я упускаю?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Более полный ответ на то, что делает argpartition , находится в документации partition , и тот говорит:

Создает копию массивас перегруппировкой его элементов таким образом, что значение элемента в k-й позиции находится в той позиции, в которой он будет находиться в отсортированном массиве.Все элементы, меньшие, чем k-й элемент, перемещаются перед этим элементом, а все равные или большие перемещаются за ним.Порядок элементов в двух разделах не определен.

Итак, для входного массива 3, 4, 2, 1 отсортированный массив будет 1, 2, 3, 4.

Результат np.partition([3, 4, 2, 1], 3) будет иметь правильное значение (т. Е. Такое же, как у отсортированного массива) в 3-м (т. Е. Последнем) элементе.Правильное значение для 3-го элемента: 4.

Позвольте мне показать это для всех значений k, чтобы было понятно:

  • np.partition([3, 4, 2, 1], 0) - [ 1 , 4, 2, 3]
  • np.partition([3, 4, 2, 1], 1) - [1, 2 , 4, 3]
  • np.partition([3, 4, 2, 1], 2) - [1,2, 3 , 4]
  • np.partition([3, 4, 2, 1], 3) - [2, 1, 3, 4 ]

ВДругими словами: k-й элемент результата совпадает с k-м элементом отсортированного массива.Все элементы до k меньше или равны этому элементу.Все элементы после него больше или равны ему.

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

0 голосов
/ 23 сентября 2018

Я помню, что мне тоже было трудно понять, может быть, документация написана плохо, но это то, что это значит, когда вы делаете a=np.argpartition(x, 3), тогда x сортируется таким образом, что только элемент в позиции 3,в этом случае k будет отсортировано, поэтому, когда вы запускаете этот код, вы в основном говорите, каким будет 3-й индекс отсортированного массива, поэтому вывод ('x[a]:', array([2, 1, 3, 4])) равен 4 (элемент 3), и, как предлагает документвсе числа, меньшие, чем перед ним (в произвольном порядке), следовательно, вы получаете 2 перед 1, поскольку он не имеет определенного порядка, я надеюсь, что это прояснит его, если вы все еще не уверены, не стесняйтесь комментировать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...