Как использовать векторизованные операции NumPy для лямбда-функций, которые возвращают постоянные значения? - PullRequest
0 голосов
/ 11 февраля 2019

Почему эта функция возвращает float?

func = lambda x: 1.
x = np.linspace(0,1,10)
func(x).shape

Результат

AttributeError: 'float' object has no attribute 'shape'

Я ожидаю следующее поведение:

func = lambda x: 1. + 0*x
x = np.linspace(0,1,10)
func(x)

array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

Как получить ожидаемыйрезультат без использования лямбда-функции (т.е. без необходимости писать func = lambda x: 1. + 0*x)?

Идея состоит в том, что пользователь передает эту функцию другой функции для дальнейшей оценки в сетке.Я не могу ожидать, что пользователь закрасит постоянную функцию как 1 + 0*x.Что я должен делать?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Проверьте метод numpy.vectorize: http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.vectorize.html

func = lambda x: 1.
x = np.linspace(0,1,10)
x_func = np.vectorize(func)
x_func(x)

возвращает: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

Хотя, исходя из вашего вопроса, вы просто хотите создать массив 1 * 10длина инициализирована до 1.

Почему бы не использовать np.full(10, 1.)?

https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.full.html

0 голосов
/ 11 февраля 2019
  1. Не используйте лямбду в качестве постоянной функции.Ваш

    func = lambda x: 1.
    

    делает абсолютно то же самое, что и

    def func(x):
        return 1.
    
  2. Не ясно, что вы пытаетесь сделать.Ваша лямбда возвращает 1.0, без учета переданных параметров.Пожалуйста, уточните, какую логику вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...