numpy将索引列表上的和向量化

numpy将索引列表上的和向量化,numpy,vectorization,Numpy,Vectorization,有什么方法可以把这个循环矢量化吗? 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]) 此循环在每列的行索引列表上生成一个和,每列的行索引不同方法#1 用于一次性生成所有的Lr[Mj,j],沿行求和,然后使用Lc执行加法- B = Lr[Nodes, np.

有什么方法可以把这个循环矢量化吗? 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])
此循环在每列的行索引列表上生成一个和,每列的行索引不同

方法#1

用于一次性生成所有的
Lr[Mj,j]
,沿行求和,然后使用
Lc执行加法-

B = Lr[Nodes, np.arange(len(Nodes))[:,None]]
L_posteriori = Lc + B.sum(1,keepdims=1)
方法#2

这些索引可以转换为一个布尔匹配数组,该数组的索引范围覆盖我们要索引的数组的长度,即
Lr
。然后,我们使用张量和约化直接得到
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]

您能否提供一些有关
Lc
Lr
的示例数据?]发布的解决方案对你有用吗?如果有,接受吗?