web-dev-qa-db-ja.com

TypeError:<lambda>()に必要な位置引数が1つありません: 'w'

コードはこちら

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)に似ています

しかし、タプルパラメータのアンパッキングが削除されたので、それを理解する方法がわかりません:(

7
yizhuo liu

問題を示す小さな実行例を作るのは良いことです。あなたの場合、いくつかの変数がないため、それは事実ではありません。他のコメントで言ったように、マップするリストはタプルでできています。すでにご存じのように、タプルをアンパックすることはできませんが、配列で使用するのと同じようにインデックスを使用できます。簡単な作業例:

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関数に渡されたラムダ関数には1つのパラメーターしかありません。これをタプルであることを明確にするためにtと呼びました。必要に応じてxと呼ぶこともできます。関数本体では、インデックスを使用してタプルの最初と2番目の要素を取得します。このコードを実行すると、機能することがわかります。次のステップは、それをコードに合わせることです。

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
Schorsch

もう開梱できません。ただし、タプルをそのまま使用し、式でインデックスを使用できます。

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

maplambdaと一緒に使用してもほとんど意味がありません。同等のジェネレーター理解:

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

(および開梱作業)

同じ構造を外側のlambdareduceで繰り返す必要があります。これは、要素の合計を実行するsumで完全に削除できます。

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

ラムダはなくなり、短くて明確になります