Как оставить только первые появления 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
→ Ссылка