コードはこちら
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)
に似ています
しかし、タプルパラメータのアンパッキングが削除されたので、それを理解する方法がわかりません:(
問題を示す小さな実行例を作るのは良いことです。あなたの場合、いくつかの変数がないため、それは事実ではありません。他のコメントで言ったように、マップするリストはタプルでできています。すでにご存じのように、タプルをアンパックすることはできませんが、配列で使用するのと同じようにインデックスを使用できます。簡単な作業例:
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)
これでうまくいくはずです。
もう開梱できません。ただし、タプルをそのまま使用し、式でインデックスを使用できます。
map(lambda t: t[0]*t[1], Zip(input_vec, self.weights))
map
をlambda
と一緒に使用してもほとんど意味がありません。同等のジェネレーター理解:
(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)
ラムダはなくなり、短くて明確になります