迭代更新Lambda函数

时间:2016-04-25 17:54:09

标签: python lambda

更新#2:请先阅读下面的内容!

-------------------------

(特别感谢大家到目前为止忍受我)

让我试着让它变得更简单。如果我知道预先计算函数f的算法,但是知道它的最终结果,我怎么能在没有重做算法的情况下进行多次函数评估呢?

f = lambda x: x**2
for pt in x:
#-----------
    for i in range(len(some_list)):
        #evaluate algorithm
        if condition 1:
            f = f + 1
        elif condition 2:
            f = f + 2
        else:
            f = f + 3
#-----------
    f(pt)

即。假设我要删除#-----------中的所有内容并执行以下操作:

f = lambda x: x**2
for i in range(len(some_list)):
    #evaluate algorithm
    if condition 1:
        f = lambda x: f(x) + 1
    elif condition 2:
        f = lambda x: f(x) + 2
    else:
        f = lambda x: f(x) + 3

for pt in x:
    f(pt)

事实上,由于你要覆盖以前的f lambda函数,所以无法完成。总的来说,我试图减少实际上重新f的次数。我想只找到一次,但多次评估它。 我可以破解它做这样的事情:

f = lambda x: x**2
temp = []
for i in range(len(some_list)):
    #evaluate algorithm
    if condition 1:
        temp.append(lambda x = f(x) + 1)
    elif condition 2:
        temp.append(lambda x = f(x) + 2)
    else:
        temp.append(lambda x = f(x) + 3)
new_f = lambda x: sum([func(x) for func in temp])

for pt in x:
    new_f(pt)

-------------------------

我希望以前有人试图这样做过。

我想为矩阵生成lambda函数但是,我不知道矩阵的先验;我通过循环迭代构建它。我们的想法是,矩阵中的每个元素都依赖于相邻原子,伪代码:

Matrix = zeros((N,N))
for i in atoms:
    Matrix.update

现在出现了问题,我有一堆矢量,比如x,它有3列,说M行。我想为x中的每一行评估这个矩阵。我可以做到以下几点:

for pt in x:
    Matrix = zeros((N,N))
    for i in atoms:
        Matrix.update(@x)

但是,如果我可以简单地生成矩阵的lambda函数,那么计算效率会更高,这样我就不必每次都重建矩阵。所以喜欢:

Matrix = zeros((N,N))
for i in atoms
    l_Matrix = lambda x: Matrix + l_Matrix
l_Matrix(x)

似乎用python很难做到这一点。不幸的是,你不能在python中递归地添加lambda函数,因为它会删除前一个实例的内存,从而导致递归损坏。

我能想到解决这个问题的唯一方法就是制作一个列表我会附加lambda函数然后将它们全部加在一起,给我最后的矩阵lambda功能。有谁知道更清洁的方式?

谢谢!

更新:一个例子。

for pt in x:
    Matrix = zeros((N,N))
    for i in atoms:
        #a bunch of if statements to determine what I do to the matrix element
        Matrix[i,i] = exp(2*pi*1.0j*sum(pt)) #for example

理想情况下,每次我想知道x点的矩阵时,我都不想生成矩阵。我宁愿找到它然后评估它。

我引起了很大的兴趣,我基本上正在研究紧密结合的哈密顿原子 - 它们有助于确定化合物或合金的电子结构。有关简单但详细的示例,请参阅:http://cacs.usc.edu/education/phys516/04TB.pdf

3 个答案:

答案 0 :(得分:2)

修改2

所以你从

开始
F0(x) = x^2 # or whatever you want

你希望得到Fn

Fn(x) = Fn-1(x) + kn
在这种情况下,

很简单,例如,如果你想要F3

F0(x) = x^2
F1(x) = F0(x) + k1
F2(x) = F1(x) + k2
F3(x) = F2(x) + k3

然后

F3(x) = F2(x) + k3
      = (F1(x) + k2) + k3  
      = F1(x) + (k2 + k3) 
      = (F0(x) + k1) + (k2 + k3) 
      = F0(x) + (k1 + k2 + k3)  

从这里可以推断出

Fn(x) = F0(x) + sum( ki )
代码中的

将是

k = 0
for i in range(len(some_list)):
    #evaluate algorithm
    if condition 1:
        k += 1
    elif condition 2:
        k += 2
    else:
        k += 3

func = lambda x: x**2 + k

答案 1 :(得分:2)

您可以使用列表(或NumPy库)列表或嵌套列表。但是,这是实现动态嵌套列表(A矩阵)的示例代码。

设M是行数:

 M=3
 X=[]
 Matrix=(x, M)
 for i in range(M):
     X.append([int(z) for z in atoms().split()])
     for i in M: //adding column:
        i.append(z)
        if (Matrix.reverse()): // Whenever you get the last element of your desired list
          Matrix[0]
          break;

答案 2 :(得分:0)

根据您的示例:

Matrix = zeros((N,N)) 
for pt in x:
    v = exp(2*pi*1.0j*sum(pt))  # because it does not use i
    for i in atoms:
        #a bunch more of potential if statements to determine Matrix
        Matrix[i,i] = v