Использование лямбда-функции для поиска элемента из другого списка или массива - PullRequest
0 голосов
/ 26 октября 2018

Отредактировал вопрос для уточнения

import numpy as np
tt = np.arange(0, 1000, 1)
st = np.arange(0, 10, 1)
def abc():
    return lambda x: st[np.where(tt==x)] if (50 < x <100) else 0
print(abc()(tt))

Ожидается, что для данного длинного периодического временного ряда tt спериод 100 , функция abc () должна вывести значения в st для интервала 50-100, 150-200, 250-300 и выплевать 0 в другом месте.Что-то вроде ..

[0....0..st.....st.0.....0.st....st.0....0.st.....st]

Ранее задаваемый вопрос ....

Я унаследовал длинный код, в который мне нужно внести некоторые изменения.Базовый формат - это ряд функций, каждая из которых возвращает лямбда-функцию

def func1():
  return lambda x: #some math with x, like x**2

def func2():
  return lambda x: #some math with x, like np.sin(x)

и т. Д.

Эти функции снабжены временным рядом, t, массивом 1Dиз которого генерируется требуемая математическая функция.Он работает правильно.

Например,

import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0, 100, 1)

def fun1():
  return lambda x: x**2

print(fun1()(t)) 
plt.plot(t, fun1()(t))
plt.savefig('Graph.png')

Теперь я хочу импортировать / читать данные из внешнего файла в виде пары [время, значение] и использовать ее для создания новой математической функции.вместо того, чтобы делать математику в самой функции, как раньше.

После чтения из файла я говорю:

time = [0, 0.1, 0.2, ..... 1000.0]
value = [v1, v2, ...........vn]

Я хочу сделать

def new_func():
   return lambda x: "*Looking for an answer*"

Так что, если я вызову new_func () (t), я получу значение в качестве вывода

Я попробовал np.where и попытался определить подфункции.Но пока ничего не получалось.Поскольку я должен передать эту функцию другому коду, я не могу изменить основной формат.Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 26 октября 2018

lambda само по себе является функцией. Помещать его в формальную функцию def как единственный выход не имеет смысла.

Если вы хотите умножить на 2 для всего списка, lambda будет недостаточно, вам также понадобится итератор. Следующее:

func = lambda x: x*2

Просто означает, что это лямбда-функция, которая будет возвращать ввод * 2, это эквивалентно:

def func(x): return x*2

Если вы хотите применить его ко всему списку, вам нужно сделать:

list(map(lambda x: x*2, mylist))

map отобразит функцию на каждый элемент списка, но это также будет работать для именованной функции.

Для того, чтобы сделать вашу цель, предполагая, что value и time list одинаковой длины.

lambda t: value[time.index(t)]

- это функция, которая вам нужна. Назовите это так:

(lambda t: value[time.index(t)])(t)
# OR:
func = lambda t: value[time.index(t)] # assign it name and then
func(t)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...