Эффективный способ понизить выборку списка

Для входного списка 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]])

И ниже результат.

Интересно, как сделать функцию более эффективной.

0 ответов

Другие вопросы по тегам