更新 #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
最佳答案
您可以使用列表的列表(或 NumPy 库)或嵌套列表。但是,这是实现动态嵌套列表(矩阵)的示例代码。
设 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;
关于python - 迭代更新 Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36847728/