Довольно стандартным способом NumPy было бы использовать расширенную индексацию:
data = [['Event Time', 'State at A'],[0.0, 1], [0.03253, 1], [0.04757, 0],
[0.08479, 0], [0.98534, 1], [0.98748, 1], [1.03602, 0], [1.03717, 0],
[1.95898, 0], [1.96456, 1], [2.00913, 1], [2.01547, 0]]
# convert to array
ar = np.array([*map(tuple,data[1:])],dtype=[*zip(data[0],(float,int))])
ar
# array([(0. , 1), (0.03253, 1), (0.04757, 0), (0.08479, 0),
# (0.98534, 1), (0.98748, 1), (1.03602, 0), (1.03717, 0),
# (1.95898, 0), (1.96456, 1), (2.00913, 1), (2.01547, 0)],
# dtype=[('Event Time', '<f8'), ('State at A', '<i8')])
# find places where State at A changes and select them from ar
# prepend something that is not equal to the first State at A, so the
# very first item is also selected
ar[np.diff(ar['State at A'],prepend=ar['State at A'][0]-1).nonzero()]
# array([(0. , 1), (0.04757, 0), (0.98534, 1), (1.03602, 0),
# (1.96456, 1), (2.01547, 0)],
# dtype=[('Event Time', '<f8'), ('State at A', '<i8')])