Подтвердить что ты не робот

Что это значит: s [s [1:] == s [: - 1]] делать в numpy?

Я искал способ эффективно проверять дубликаты в массиве numpy и наткнулся на вопрос, содержащий ответ, используя этот код.

Что означает эта линия в numpy?

s[s[1:] == s[:-1]]

Хотелось бы понять код перед его применением. Посмотрел в документе Numpy, но не смог найти эту информацию.

4b9b3361

Ответ 1

Срезки [1:] и [:-1] означают все, кроме первого и всех, кроме последних элементов массива:

>>> import numpy as np
>>> s = np.array((1, 2, 2, 3))  # four element array
>>> s[1:]
array([2, 2, 3])  # last three elements
>>> s[:-1]
array([1, 2, 2])  # first three elements

поэтому сравнение генерирует массив логических сравнений между каждым элементом s[x] и его "соседом" s[x+1], который будет на один короткий, чем исходный массив (поскольку последний элемент не имеет соседнего):

>>> s[1:] == s[:-1]
array([False,  True, False], dtype=bool)

и используя этот массив для индексации исходного массива, вы получите элементы, в которых сравнение True, то есть элементы, которые являются такими же, как и их сосед:

>>> s[s[1:] == s[:-1]]
array([2])

Обратите внимание, что это только идентифицирует повторяющиеся значения рядом.

Ответ 2

Проверьте это:

>>> s=numpy.array([1,3,5,6,7,7,8,9])
>>> s[1:] == s[:-1]
array([False, False, False, False,  True, False, False], dtype=bool)
>>> s[s[1:] == s[:-1]]
array([7])

Итак s[1:] дает все числа, кроме первого, и s[:-1] все, кроме последнего. Теперь сравните эти два вектора, например. посмотрите, являются ли два соседних элемента одинаковыми. Наконец, выберите эти элементы.

Ответ 3

s[1:] == s[:-1] сравнивает s без первого элемента с s без последнего элемента, то есть 0-го с 1-м, 1-м со вторым и т.д., предоставляя вам массив из len(s) - 1 булевых элементов. s[boolarray] будет выбирать только те элементы из s, которые имеют True в соответствующем месте в boolarray. Таким образом, код извлекает все элементы, которые равны следующему элементу.

Ответ 4

Он отображает дубликаты в отсортированном массиве.

В основном внутреннее выражение s[1:] == s[:-1] сравнивает массив со сдвинутой версией. Представьте себе следующее:

1, [2, 3, ... n-1, n  ]
-  [1, 2, ... n-2, n-1] n
=> [F, F, ...   F, F  ]

В отсортированном массиве в приведенном массиве не будет True, если у вас не было повторения. Затем это выражение s[array] фильтрует те, которые имеют True в индексе array.