Как оставить только первые появления True и последующие повторения заменить на False?
Надо производительным способом без циклов. Исходный вектор:
arr = np.array([True, True, False, True, True, False, False, False, True, True, True, False, True])
Ожидаемый результат:
[ True False False True False False False False True False False False True]
Пример решения с циклом:
import numpy as np
arr = np.array([True, True, False, True, True, False, False, False, True, True, True, False, True])
res = np.full_like(arr, fill_value=False)
for i in range(0, len(arr)):
if i > 0:
if not arr[i - 1] and arr[i]:
res[i] = True
elif arr[i]:
res[i] = True
print(arr)
print(res)
# [ True True False True True False False False True True True False True]
# [ True False False True False False False False True False False False True]
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
Решение с использованием Pandas:
import pandas as pd
s = pd.Series(arr)
s.loc[s & s.shift()] = False
res = s.to_numpy()
результат:
In [417]: res
Out[417]:
array([ True, False, False, True, False, False, False, False, True,
False, False, False, True])
Автор решения: Stanislav Volodarskiy
→ Ссылка
Тут даже объяснять ничего не надо, так это красиво:
a[1:][a[:-1] & a[1:]] = False