这个Python函数是如何读取的?

时间:2018-05-22 07:42:38

标签: python numpy

Wikipedia有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如何引用分子中的数组元素并跨越分母中的所有元素?

[注意:The question这个问题大概是重复约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 :(得分:1)

lambda表达式就像anonymous function。在这个上下文中,行

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

相当于

def softmax(x):
    return np.exp(x)/np.sum(np.exp(x))

答案 1 :(得分:1)

  

我不明白如何阅读lambda函数。

lambda函数是一个未绑定到名称

的匿名函数
  

特别是,参数x如何引用数组元素   分子和跨度分母中的所有元素?

不,参数x不是指数组元素,而是指整个数组。 np.exp(x)方法也返回一个新数组。

通过撰写np.exp(x)/np.sum(np.exp(x))np.exp(x)生成的数组将被划分为sum,这意味着数组中的每个项目都会被划分为该总和。

答案 2 :(得分:1)

三个评论。

在示例中使用lambda实际上是不好的风格,参见这段来自Python style guide

  

始终使用def语句而不是赋值语句   将lambda表达式直接绑定到标识符。

     

是:

     

def f(x):返回2 * x

     

没有

     

f = lambda x:2 * x

     

第一种形式表示生成的函数对象的名称是   特别是' f'而不是通用的'。这是更多   通常用于回溯和字符串表示。使用   赋值语句消除了lambda的唯一好处   表达式可以提供一个明确的def语句(即它可以   被嵌入一个更大的表达式中)

重新审视内容。你看到的是阵列算术。 np.exp是一个numpy ufunc,它以元素方式运行,因此它将返回与其参数形状相同的数组。 np.sum是一个reduce函数,当使用数组作为唯一参数调用时,它将返回一个标量。 /运算符重载了二进制ufunc;像np.exp一样,它在元素方面运作。此外,它进行广播:在这种情况下,标量分母将与数组分子的每个元素配对,从而产生一个数组。

最后:Here是如何实现softmax properly