Создание сценария, способного генерировать функциональные объекты (в данном случае кусочные функции) по заданным параметрам - PullRequest
0 голосов
/ 10 июня 2019

Мне было интересно, как лучше всего сделать следующее. Рассмотрим кусочную функцию, которая принимает постоянные значения для разных диапазонов. Например: от t = 0 до t = 2, x = 3 и от t = 2 до t = 4, x = 1. Я определяю кусочную функцию по следующим параметрам:

  • список х, например [3,3,1,1,1]

или

  • два списка, которые генерируют список x. Приведенный выше пример генерируется с помощью [3,1] (значения x) и [2,3] (как часто они повторяются).

Исходя из этого, я хочу, чтобы скрипт создал следующую функцию, используя приведенный выше пример:

def function(x):
    if 0 <= x < 2:
        return 3
    if 2 <= x <= 4:
        return 1

Таким образом, мне нужен какой-то метод, который будет принимать либо список значений x, либо список x и то, как часто они повторяются для создания функции x:

def function(x)
    if bound1 <= x < bound2:
        return x1
    if bound2 <= x < bound3: 
        return x2
    if bound3 <= x < bound4:
        return x3

    ...

    if bound_n-1 <= x < bound_n:
        return x_n

Я читал о классах и обёртывании функций, но всё ещё немного не уверен относительно того, что было бы лучшим решением для этой проблемы.

Спасибо

1 Ответ

1 голос
/ 10 июня 2019

Может быть, вам стоит взглянуть на функцию bisect.bisect_right ( официальный документ ):

from bisect import bisect_right
from functools import partial

# <0, 2) -> 3
# <2, 4) -> 1
# <4, 6) -> 99
bounds          = [0, 2, 4, 6]
return_values   = [3, 1, 99]

def fn(val, bounds, return_values):
    i = bisect_right(bounds, val) - 1
    return return_values[i] if i < len(return_values) else None

# function(x)
function = partial(fn, bounds=bounds, return_values=return_values)

print(function(0))
print(function(1))
print(function(2))
print(function(3))
print(function(4))
print(function(5))
print(function(6))

Отпечатки:

3
3
1
1
99
99
None

Редактировать: Обновлен ответ для вызоваfunction() только с одним параметром.

...