更新#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
为了宽慰存储器中保存的问题,而是一个列表的使用元组,它可能是-.Removing单独的元组元素有用是不可能的语句显式删除整个元组。 – Ssein
如果我正确理解你,我不想删除元素,尽管这是可能的。我可以附加一个项目,然后删除它,但内存仍然会在那里*(我想?)* ....我想我看看是否有一种方法可以在lambda函数上更优雅地迭代。 – Oru
如果我正确理解你的问题,你有没有想过创建一个自定义操作符? –