如何评估Lambda函数数组

时间:2019-07-22 18:56:21

标签: python python-3.x numpy lambda

我正在尝试编写一个函数,该函数将创建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]]

2 个答案:

答案 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))