На мой взгляд, есть два варианта. (Здесь numpy импортируется как np)

< Сильный > 1 . Использование лямбда-выражения

Это можно использовать, когда мы имеем дело с простой функцией. Скажем, я хочу реализовать функцию f: (x, y) = (x ^ 2, x + y). Тогда я ожидал бы, что некоторые из них будут работать:

f = lambda x,y : x**2, x + y

f = lambda x,y : (x**2, x + y)

Когда я звоню print(f(np.array([[1],[3]],float))) или print(f(np.array([1,3],float))). Но я не могу заставить работать любой вариант этих лямбда-выражений.

< Сильный > 2 . Определение «правильной» функции

Это, однако, работает:

def f(vec):
    return np.array([vec[0] ** 2, vec[0] + vec[1]])

Но оптимален ли синтаксис? И как бы я это сделал, если я не хочу, чтобы вышеуказанная «правильная» функция была векторизована. В целом, как я могу определить функцию со значением numpy-array, принимающую значения numpy-array?

1
AfterMath 15 Фев 2020 в 13:40

2 ответа

Лучший ответ

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

Но давайте продемонстрируем на простых интерактивных примерах

Определите две переменные:

In [121]: x, y = 1,3                                                                           
In [122]: x**2, x+y                                                                            
Out[122]: (1, 4)             # returns a tuple

Определить список:

In [125]: vec = [1,3]                                                                          
In [126]: vec[0]**2, vec[0]+vec[1]                                                             
Out[126]: (1, 4)             # same tuple

Или массив:

In [127]: arr = np.array([1,3])                                                                

[126] тоже бы с этим работал, но индексация массива идет медленнее.

Массивы лучше всего подходят для всего массива, а не только для элементов. Например, мы можем возвести в квадрат все члены массива или суммировать их.

In [128]: arr**2, arr.sum()                                                                    
Out[128]: (array([1, 9]), 4)

Эти вычисления будут работать с массивом любого размера, а не только с формой (2,).

Любой из вышеперечисленных кортежей может быть преобразован в массив:

In [133]: np.array([x**2, x+y])                                                                
Out[133]: array([1, 4])
1
hpaulj 15 Фев 2020 в 18:31

Если вы знаете, что входные данные всегда будут массивом длины 2, вы можете использовать:

 f = lambda x : (x[0]**2, x[0] + x[1])

Тогда примеры, которые вы приводите, также работают.

1
GoodDeeds 15 Фев 2020 в 10:43