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
的总和。
答案 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
一样,它在元素方面运作。此外,它进行广播:在这种情况下,标量分母将与数组分子的每个元素配对,从而产生一个数组。