有没有办法对此for循环进行矢量化? Lc是矢量,Lr是2D阵列
for j in range(n):
Mj = Nodes[j] # Mj is a list of indices to sum over
L_posteriori[j] = Lc[j] + sum(Lr[Mj,j])
此循环在每列的行索引列表上生成一个总和,每列的行索引不同
答案 0 :(得分:1)
方法#1
使用advanced-indexing
一次性生成所有Lr[Mj,j]
,沿其行汇总,然后使用Lc
执行添加 -
B = Lr[Nodes, np.arange(len(Nodes))[:,None]]
L_posteriori = Lc + B.sum(1,keepdims=1)
方法#2
这些索引可以转换为与索引范围相关的布尔匹配数组,这些索引覆盖我们正在索引的数组的长度,即Lr
。然后,我们使用np.einsum
使用{{3}}直接从B
获得这些行的总和 -
mask = Nodes == np.arange(len(Lr))[:,None,None]
B_rowsum = np.einsum('ij,ijk->j',Lr,mask)
因此,请为Lc
添加B_rowsum
以获得所需的输出 -
L_posteriori = Lc + B_rowsum[:,None]