Как читается эта функция Python? - PullRequest
0 голосов
/ 22 мая 2018

Википедия имеет следующий пример кода для softmax .

>>> import numpy as np
>>> z = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
>>> softmax = lambda x : np.exp(x)/np.sum(np.exp(x))
>>> softmax(z)
array([0.02364054, 0.06426166, 0.1746813 , 0.474833  , 0.02364054 , 0.06426166, 0.1746813 ])

Когда я его запускаю, он работает успешно.Я не понимаю, как читать функцию lambda.В частности, как параметр x может ссылаться на элемент массива в числителе и охватывать все элементы в знаменателе?

[Примечание: Вопрос этот вопрос предположительно дублирует примерноlambdas в общем.Этот вопрос не обязательно о lambda.Это о том, как читать np соглашения.Ответы @Paul Panzer и @Mihai Alexandru-Ionut оба отвечают на мой вопрос.Жаль, что я не могу проверить оба одновременно, отвечая на вопрос.

Чтобы подтвердить, что я понимаю их ответы (и уточнить, о чем мой вопрос):

  • xэто весь массив (как и должно быть, поскольку массив передается в качестве аргумента).
  • np.exp(x) возвращает массив с каждым элементом x[i], замененным на np.exp(x[i]).Вызов этого нового массива x_new.
  • x_new/np.sum(x_new) делит каждый элемент x_new на сумму x_new.

]

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Я не понимаю, как читать лямбда-функцию.

Лямбда-функция - это анонимная функция, которая не связана с именем

В частности, как параметр x может ссылаться на элемент массива в числителе и охватывать все элементы в знаменателе?

Нет, параметр x относится не к элементу массива, а квесь массив.np.exp(x) метод также возвращает новый массив.

Путем записи np.exp(x)/np.sum(np.exp(x)) массив, полученный из np.exp(x), будет разделен на sum, и это означает, что каждый элемент массива будет разделен на этотсумма.

0 голосов
/ 22 мая 2018

Три замечания.

Использование lambda в примере на самом деле плохой стиль, ср.этот абзац из Руководства по стилю Python :

Всегда используйте оператор def вместо оператора присваивания, который связывает лямбда-выражение непосредственно с идентификатором.

Да:

def f (x): return 2 * x

No:

f = lambda x: 2 * x

Первая форма означает, чтоимя получающегося функционального объекта определенно 'f' вместо общего ''.Это более полезно для трассировок и строковых представлений в целом.Использование оператора присваивания исключает единственное преимущество, которое лямбда-выражение может предложить по сравнению с явным оператором def (т. Е. То, что оно может быть встроено в большее выражение)

Re содержимого.То, что вы видите, является массивом арифметики.np.exp это numpy ufunc он работает поэлементно, поэтому он возвращает массив той же формы, что и его аргумент.np.sum - сокращающая функция, при вызове с массивом в качестве единственного аргумента она возвращает скаляр.Оператор / перегружен двоичным кодом ufunc;как np.exp он действует поэлементно.Кроме того, он выполняет вещание: в этом случае скалярный знаменатель будет связан с каждым элементом числителя массива, в результате чего будет получен массив.

И, наконец: Здесь - как реализовать softmax правильно .

0 голосов
/ 22 мая 2018

Лямбда-выражение похоже на анонимную функцию .В этом контексте строка

softmax = lambda x : np.exp(x)/np.sum(np.exp(x))

эквивалентна

def softmax(x):
    return np.exp(x)/np.sum(np.exp(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...