Skip to content

Instantly share code, notes, and snippets.

Created November 5, 2017 23:53
What would you like to do?
Find runs of consecutive items in a numpy array.
import numpy as np
def find_runs(x):
"""Find runs of consecutive items in an array."""
# ensure array
x = np.asanyarray(x)
if x.ndim != 1:
raise ValueError('only 1D array supported')
n = x.shape[0]
# handle empty array
if n == 0:
return np.array([]), np.array([]), np.array([])
# find run starts
loc_run_start = np.empty(n, dtype=bool)
loc_run_start[0] = True
np.not_equal(x[:-1], x[1:], out=loc_run_start[1:])
run_starts = np.nonzero(loc_run_start)[0]
# find run values
run_values = x[loc_run_start]
# find run lengths
run_lengths = np.diff(np.append(run_starts, n))
return run_values, run_starts, run_lengths
Copy link

bmeyers commented Feb 6, 2020

This is great! Just what I needed, thank you. Included in my research code with attribution.

Copy link

Glad it's useful!

Copy link

endrebak commented Feb 7, 2020

Btw, if anyone needs an artihmetic RLE library, check out :)

Copy link

Btw, if anyone needs an artihmetic RLE library, check out :)


Copy link

Thank you :)

Copy link

Thanks! This is exactly what I needed!

Copy link

Thanks! Nice work, just what I want!

Copy link

ivoolong commented Jun 8, 2021


Copy link

Very good! Thanks.

Copy link

Thanks finally a solution that works as intended

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment