如何计算lambda函数数组

2024-03-28 12:03:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个函数,它将创建一个lambda函数列表,然后向该列表传递一个数组。你知道吗

我知道如何硬编码这个函数列表,但是,我似乎不知道如何使用for循环来创建列表。你知道吗

举个例子,我们用一个非常简单的函数,把a的每个元素乘以1,然后乘以2,然后乘以3。。。以此类推,每一行对应于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]]

Tags: lambda函数importnumpy元素列表forreturn
2条回答

_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)]

此循环已中断:

for n in range(N):
    F.append(lambda x: _f(n))

因为n是在函数体中延迟读取的(所以存储的所有函数都从循环中读取n最终值)。你知道吗

最简单的修复方法是将n绑定为默认的参数;默认参数在定义时被急切地绑定:

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

相关问题 更多 >