我正在尝试编写一个函数,该函数将创建lambda函数列表,然后将数组传递给该列表。
我想出了如何对该函数列表进行硬编码,但是,我似乎无法弄清楚如何使用for循环创建列表。
例如,让我们采用一个非常简单的函数,其中我们将A的每个元素乘以1,然后乘以2,然后乘以3,...,依此类推,以便每一行对应于A的元素,每一列对应于A的元素。 A乘以的数字。
import numpy as np
A = np.array([1,2,3,4])
def f():
F3 = lambda x: 3*x
F2 = lambda x: 2*x
F1 = lambda x: 1*x
F0 = lambda x: 0*x
return lambda x: np.stack((F3(x),F2(x),F1(x),F0(x)),axis=1)
F = f()
F(A)
然后是我的输出。
array([[ 3, 2, 1, 0],
[ 6, 4, 2, 0],
[ 9, 6, 3, 0],
[12, 8, 4, 0]])
上面的代码仅转到3 * x。如果我想遵循模式到n * x,该怎么办?我的基本想法如下(但是,这不起作用):
import numpy as np
A = np.array([1,2,3,4])
def _f():
return lambda x: n*x
def f(N):
F = []
for n in range(N):
F.append(lambda x: _f(n))
return np.array(F)
F = f(5)
F(A)
在现实生活中,我的函数_f()非常复杂。其背后的动机是,我希望我的程序仅对每个_f进行一次迭代,然后一次性执行计算F(A)。
所需的输出可以通过以下代码实现,但是,每次调用F时,都会循环遍历该循环。
import numpy as np
A = np.array([1,2,3,4])
def _f(n,x):
return n*x
def f(N,x):
F = []
for n in range(N):
F.append(_f(n,x))
return np.array(F)
F = f(5,A)
print(F.T)
这将返回:
[[ 0 1 2 3 4]
[ 0 2 4 6 8]
[ 0 3 6 9 12]
[ 0 4 8 12 16]]
答案 0 :(得分:0)
_f
(正确定义;应该将n
作为参数,而不是将n
作为全局变量)已经是函数,在调用该函数时,它会返回所需的函数。
# Or _f = lambda n: lambda x: n * x
def _f(n):
return lambda x: n * x
F = [_f(n) for n in range(N)]
也就是说,您可以使用functools.partial
来完全避免lambda表达式及其作用域问题:
from functools import partial
from operator import mul
F = [partial(mul, n) for n in range(N)]
答案 1 :(得分:0)
此循环中断:
for n in range(N):
F.append(lambda x: _f(n))
因为n
是在函数主体中延迟读取的(因此存储的所有函数都会从循环中读取n
的 final 值)。
最简单的解决方法是将n
绑定为默认的 argument ;默认参数在定义时急切地绑定:
for n in range(N):
F.append(lambda x, n=n: _f(n))
^^^^^ Changed part
如果要避免使用默认参数,请让工厂函数为您执行急切的绑定:
def _f(n): # Now receives n as an argument to outer function
return lambda x: n*x # While inner function uses n from closure and x passed when called
然后将其用于:
for n in range(N):
F.append(_f(n))