Что это значит: s [s [1:] == s [: - 1]] делать в numpy?
Я искал способ эффективно проверять дубликаты в массиве numpy и наткнулся на вопрос, содержащий ответ, используя этот код.
Что означает эта линия в numpy?
s[s[1:] == s[:-1]]
Хотелось бы понять код перед его применением. Посмотрел в документе Numpy, но не смог найти эту информацию.
Ответы
Ответ 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
.