Объяснение numpy .unique, когда дана ось - PullRequest
1 голос
/ 06 апреля 2020

Согласно документации numpy, np.unique будет возвращать уникальные значения в массиве, а также счетчики и индексы, но когда указана ось, я запутался. Может кто-нибудь объяснить пример ниже?

>>> a = np.array([[1, 2, 3], [5, 2, 3], [0, 2, 3], [1, 2, 3]])
>>> a
array([[1 2 3]
       [5 2 3]
       [0 2 3]
       [1 2 3]])
>>> unique_rows, indices, occurrence_count = np.unique(a, axis=0, return_index=True, return_counts=True)
>>> print(unique_rows)   # why not
[[[0 2 3]                  [1 2 3]
  [1 2 3]                  [5 2 3]
  [5 2 3]]]                [0 2 3] but a strange order
>>> print(indices)
[2 0 1]
>>> print(occurrence_count)
[1 2 1]
>>> b, c, d = np.unique(a, axis = 1, return_index = True, return_counts = True)
>>> print(b)
[[1 2 3]
 [5 2 3]
 [0 2 3]
 [1 2 3]]
>>> print(c)  
[0 1 2]       # where do these indices come from?
>>> print(d)
[1 1 1]       # where do these counts come from?

1 Ответ

2 голосов
/ 06 апреля 2020

Результаты unique отсортированы лексикографически, как строки. Согласно разделу примечаний в документах:

Когда указана ось, подрешетки, проиндексированные осью, сортируются. Это делается путем задания указанной оси первым размером массива, а затем выравнивания подрешеток в порядке C. Затем сплющенные подмассивы рассматриваются как структурированный тип с каждым элементом, которому присваивается метка, в результате мы получаем 1-D массив структурированных типов, который можно обрабатывать так же, как и любой другой 1-D массив. В результате уплощенные подмассивы сортируются в лексикографическом порядке c, начиная с первого элемента.

Когда axis=0, вы смотрите на каждую строку, как если бы она была элементом структурированного массив. Сначала мы сравниваем первые элементы для сортировки. Если они идентичны, переходите ко второму элементу, et c. Если все элементы одинаковы, строки идентичны. Ясно, что 0, 2, 3 предшествует 1, 2, 3. Индексы - это местоположения первого вхождения каждой отдельной строки в результате. 0, 2, 3 - это строка 2 на входе, 1, 2, 3 встречается дважды при индексах 0 и 3: 0 идет первым. 5, 2, 3 встречается с индексом 1.

Тот же лог c применяется к axis=1, за исключением того, что теперь вы работаете с разными столбцами. Ни один из столбцов не повторяется, поэтому все счетчики равны 1. Порядок должен быть довольно ясным на этом этапе.

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