首页 > 解决方案 > 消除 Python 中的 for 循环

问题描述

我必须使用以下公式在 python 中计算一些数量:(由于无法识别 LaTeX 语言,我将发布图像)

在此处输入图像描述

其中“psi”只是二伽马函数,v_j 和 alpha_{t, bl}^{l} 是浮点数,t={0, 1, 2}, bl = {0, 1, 2, 3} 和 l = {1, 2, ..., 309}。

现在我已经解决了将 v_j 分组到一个列表中并将 alpha 分组到嵌套字典中(按顺序:l、t、bl),用三个 for 循环迭代公式:

for loop in tqdm(range(500)):
logr = []
for t in range(3):
    add1 = digamma(V[t]) - digamma(sum(V))
    add2 = 0
    for b in test.columns[2:-1]:
        add2 += digamma(alphas[b][t][test.iloc[395][b]]) - digamma(sum(alphas[b][t])) 
    logrho = add1 + add2
    logr.append(logrho)
rho = np.exp(logr)
q = rho/sum(rho)

问题是我必须重复这些代码行数百次。所以,我正在寻找一种最终矢量化我的问题的方法。我的第一个猜测是将“alpha 字典”转换为数据框(pd.DataFrame.from_dict()),但我仍然无法摆脱 for 循环。

有没有更好的方法来解决这个问题?也许创建一个三维熊猫数据框?

编辑

我正在努力解决的真正问题是方程的第二部分(让我忘记 digamma 函数)。alpha 参数有 3 个维度:t=0,1,2;l=1,2,...,N 并且 bl=0,1,2,3。假设我们修复了 t,这样我们最终只在 t=0,1,2 上进行迭代。alpha 参数可以用二维数据框表示:

bl     l1     l2     l3     ...     lN
0      a0l1   a0l2   a0l3           a0lN
1      a1l1   a1l2   a1l3           a1lN
2      ...
3      a3l1   ...                   a3lN

我不应该从每个 alpha 中减去该列的总和,而应该只从四个类 bl=0、1、2、3 中的一个中减去。如果在数据中,变量 l1 提供的结果为 3,我应该从 a3l1 中减去 l1 列的 alpha 总和;如果 l2 中的结果为 0,我应该从 a0l2 中减去 l2 列的 alpha 之和,依此类推。最后将结果的总和相加(sum over l)

标签: pythonfor-loopvectorization

解决方案


推荐阅读