numpy vectorize总和指数列表

时间:2018-03-27 15:40:27

标签: numpy vectorization

有没有办法对此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])

此循环在每列的行索引列表上生成一个总和,每列的行索引不同

1 个答案:

答案 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]