类型错误:lambda函数缺少一个必需的位置参数“w”。

13

代码在这里

return self.activator(reduce(lambda a, b: a+b, map(lambda x, w: x*w, zip(input_vec, self.weights)), 0.0) + self.bias)

Python2.7版本的代码是这样的 lambda (x, w)

但是现在元组参数解包已经被删除了,所以我不知道该怎么办 :(


如果我理解正确的话,您认为map函数期望一个只有一个元素的函数。如果您映射一个元组列表,您可以通过索引获取值。 x = (13, 37) print(x[0], x[1]) - Schorsch
额,我不太明白你的意思。w的参数还不够。 - yizhuo liu
@yizhui liu,你不应该在参数中使用x和y,而是只使用一个参数和函数体中的索引。我已经回答了这个问题,并提供了相应的代码。希望能对你有所帮助。请看这里 - Schorsch
请澄清一下:我想你的意思是你正在使用Python 3,由于元组解包已被删除,因此您不能再声明一个输入为元组的lambda函数,如lambda (x, w),并自动将其输入参数解包为x,w。对吗? - smci
2个回答

8

制作一个小的运行示例以展示问题是一件好事。在你的情况下,这并不是事实,因为我们缺少一些变量。正如我在其他评论中所说,您映射的列表由元组组成。就像您已经知道的那样,您不能再解包元组,但是您可以使用索引,就像您在数组上使用的方式一样。以下是一个简单的工作示例:

val = reduce(lambda a, b: a+b, map(lambda t: t[0]*t[1], zip([10, 20, 30], [0.1, 0.3, 0.7])), 0.0)
print(val)

如您所见,传递给map函数的lambda函数现在只有一个参数。我将其称为t,以明确这是一个元组,如果您愿意,可以将其称为x。在函数体中,我使用索引来获取元组的第一个和第二个元素。如果您运行此代码,您会发现它可以工作。因此,下一步是将其适应到您的代码中:

return self.activator(reduce(lambda a, b: a+b, map(lambda t: t[0]*t[1], zip(input_vec, self.weights)), 0.0) + self.bias)

这应该就可以了。

6

您不能再进行解包操作。但是,您可以将元组作为整体,并在公式中使用索引:

map(lambda t: t[0]*t[1], zip(input_vec, self.weights))

使用lambdamap结合的效果有限,生成器表达式是等价的:

(x*w for x,w in zip(input_vec, self.weights))    

(并且解包有效)

相同的结构需要在外部lambda和甚至reduce中重复,可以使用完全消除的sum执行元素的求和:

return self.activator(sum(x*w for x,w in zip(input_vec, self.weights)) + self.bias)

没有更多的lambda,更短更清晰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接