Эффективный способ понизить выборку списка
Для входного списка x, который, например, генерируется линейно от 10k до 10e6 с шагом 10k. Когда x мало, относительное отношение между соседними x велико. Когда x велико, относительное отношение между соседними x мало.
Вопрос в том, как сгенерировать x_new с более логарифмическим интервалом. Например, при указании x_new[n]/x_new[n-1] не должно быть меньше отношения.
Ниже приведено то, о чем я могу думать как о прямом способе сделать это.
def decimate(x,max_pts_per_decade):
ratio = 10**(1/max_pts_per_decade)
return_index = []
return_index.append(0)
x_previous = x[0]
for index in range(1,len(x)):
if x[index]/x_previous>=ratio:
x_previous = x[index]
return_index.append(index)
return return_index
А ниже тестовый код. Указав максимально 10 баллов за декаду, это означает минимальное отношение 1,259 между двумя соседними компонентами.
import numpy as np
x = np.linspace(10e3,10e6,int((10e6-10e3)/10e3))
max_pts_per_decade = 10
target_ratio = 10**(1/max_pts_per_decade)
print("target_ratio:",target_ratio)
result = decimate(x,10)
print(result)
for index in range(1,len(result)):
print(x[result[index]]/x[result[index-1]])
Интересно, как сделать функцию более эффективной.