2016-04-25 88 views
3

更新#2:请先阅读以下内容!迭代更新Lambda函数

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

(特别感谢大家的忍受我这么远)

让我试着让它更简单。如果我知道预先计算函数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中递归地添加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

+0

为了宽慰存储器中保存的问题,而是一个列表的使用元组,它可能是-.Removing单独的元组元素有用是不可能的语句显式删除整个元组。 – Ssein

+0

如果我正确理解你,我不想删除元素,尽管这是可能的。我可以附加一个项目,然后删除它,但内存仍然会在那里*(我想?)* ....我想我看看是否有一种方法可以在lambda函数上更优雅地迭代。 – Oru

+0

如果我正确理解你的问题,你有没有想过创建一个自定义操作符? –

回答

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 
+0

你有我正在尝试做的要点,所以我会在这里劫持一个评论。如果我知道我的矩阵(不包括pt)具有相同的结构,那么如何防止每次都重新制作矩阵,而不是只是在'pt'处进行评估。 考虑如果我需要做更多的努力来确定矩阵,即如果语句和一堆算法和函数调用。 – Oru

+0

对,我们也可以将数组创建移动到循环外部,因为它不依赖于x。 – JulienD

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

这是正确的。现在我希望做的是避免经历嵌套循环'len(x)'次。所以做你做的事情,但我只想做一次内部循环,以提高效率。如果你有兴趣,我已经发布了一个完整的思考链接。 – Oru

+1

那是量子物理?我失去了那里...无论如何,检查我的编辑,避免内部循环是可能的,取决于在哪里放置的条件 – Copperfield

+1

我赞赏你所有的如此感兴趣和帮助我。是的,它是量子的,但更接近凝聚态物理。我更新了我的帖子,让你们知道更多信息。我觉得你仍然在做我正在做的事情,即在循环内有一个我想用lambda函数替换的参数。 – Oru

2

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

让公司的M是行数:除非您使用DEL

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; 
+0

python有matries一样简单。请参阅'numpy.linalg' – Oru