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

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

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))

Ожидается, что для данного длинного временного ряда периодическийтт с периодом 100 функция abc () должна вывести значения в улулrong> для интервала 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 и пробовал определять подфункции. Но пока ничего не работает. Поскольку мне нужно передать эту функцию другому коду, я не могу изменить основной формат. Пожалуйста, порекомендуйте.

Слово «сгенерированный» здесь используется очень странно. Приведите конкретный пример с реальным файлом, содержащим фактические числа и фактическую функцию, которую вы «сгенерировали».

Mad Physicist 26.10.2018 04:43

Только что отредактировал простой пример, который работает.

nsk 26.10.2018 05:04
0
2
2 041
1

Ответы 1

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

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

func = lambda x: x*2

Просто означает, что это лямбда-функция, которая возвращает input * 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)

Я намерен использовать значение, прочитанное из файла, а не использовать математические вычисления в лямбда-функции.

nsk 26.10.2018 04:15

Вам нужно дать более четкое представление о том, чем вы хотите заниматься. Я не могу понять, для чего вы хотите его использовать, исходя из того, что вы написали в своем вопросе.

Rocky Li 26.10.2018 04:16

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

nsk 26.10.2018 04:18
lambda t: value[time.index(t)] сделает то, что вам нужно. но вы не можете вернуть lambda, поскольку он сам по себе является функцией.
Rocky Li 26.10.2018 04:22

значение дает неразрешенную ссылку. Разве это не для словарей? Пожалуйста, поправьте меня.

nsk 26.10.2018 04:27

Разве это не то, что вы назвали своим списком ценностей?

Rocky Li 26.10.2018 04:28

Данные (пары время-значение), которые у меня есть, читаются из текстового файла. Как вы думаете, их использование в формате словаря поможет решить эту проблему? Я могу попробовать это.

nsk 26.10.2018 04:29

Думаю, я перепутал свое использование значения со значением метода. Но тогда мое время - массив numpy и не имеет индекса атрибута

nsk 26.10.2018 04:30

Переведите это на list с помощью time = list(time), в качестве альтернативы используйте value[np.where(time==t)[0][0]] Я думаю, что перевод на list менее запутан

Rocky Li 26.10.2018 04:43

Со списком он говорит, что истинное значение массива с более чем одним элементом неоднозначно. Используйте any () или all (). С np.where, который я пробовал ранее, он работает, но не дает правильных значений. Выбирает одно значение из массива и использует его все время.

nsk 26.10.2018 05:01

Я не могу воспроизвести, вы уверены, что используете lambda t: your_value[your_time.index(t)] в этом формате?

Rocky Li 26.10.2018 05:05

Да, это то, что я использую. Я пробовал, чтобы значения по-прежнему были массивами numpy, а также преобразовал их в список, например временные ряды.

nsk 26.10.2018 05:09

Вы уверены, что не дублируете имя лямбда-входа с именем списка? Если я это сделаю, произойдет та же ошибка.

Rocky Li 26.10.2018 05:11

Нет, я перепроверил. Я сделал еще один быстрый пример и решил, что если в конце я вызываю new_func () с отдельными значениями, они совпадают и дают соответствующие правильные значения y. Но с использованием списка времени new_func () (time) не работает.

nsk 26.10.2018 05:26

Вам нужно обернуть вашу лямбда-функцию (lambda: ..) (), чтобы вызвать ее как функцию

Rocky Li 26.10.2018 05:53

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

nsk 27.10.2018 07:07

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