python – How to leave only the first occurrences of True and replace subsequent repetitions with False?

Question:

It should be done in a productive way without loops. Original vector:

arr = np.array([True, True, False, True, True, False, False, False, True, True, True, False, True])

Expected Result:

[ True False False True False False False False True False False False True]

An example of a solution with a loop:

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]

Answer:

You don't even need to explain anything, it's so beautiful:

a[1:][a[:-1] & a[1:]] = False
Scroll to Top