Вот однопроходное решение, в котором
1) вычисляет разницу d между последовательными точками
2) делит потолок d шаг за шагом, чтобы получить m
2a), необязательно, округляет m до ближайшей степени двух
3) делит d на м и повторяет результат м раз
4) образует совокупную сумму
Вот код.Техническое примечание: первый элемент d - это не разница, а «якорь», поэтому он равен первому элементу данных.
def fill(data, step, force_power_of_two=True):
d = data.copy()
d[1:] -= data[:-1]
if force_power_of_two:
m = 1 << (np.frexp(np.nextafter(d / step, -1))[1]).clip(0, None)
else:
m = -(d // -step).astype(int)
m[0] = 1
d /= m
return np.cumsum(d.repeat(m))
Пример выполнения:
>>> inp
array([10.08 , 14.23 , 19.47 , 21.855, 24.34 , 25.02 ])
>>> fill(inp, 3)
array([10.08 , 12.155, 14.23 , 16.85 , 19.47 , 21.855, 24.34 , 25.02 ])