【问题标题】:numpy vectorize sums over lists of indicesnumpy对索引列表进行矢量化总和
【发布时间】:2018-03-28 00:09:02
【问题描述】:

有没有办法对这个 for 循环进行矢量化? Lc是一个向量,Lr是一个二维数组

    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])

这个循环对每列的行索引列表产生一个总和,每列的行索引不同

【问题讨论】:

  • 您能提供一些LcLr 的示例数据吗? ]
  • 发布的解决方案对您有用吗?接受的话?

标签: numpy vectorization


【解决方案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 直接通过张量和归约从B 中得到这些行的总和,就像这样 -

mask = Nodes == np.arange(len(Lr))[:,None,None]
B_rowsum = np.einsum('ij,ijk->j',Lr,mask)

所以,添加 LcB_rowsum 以获得所需的输出 -

L_posteriori = Lc + B_rowsum[:,None]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-18
    • 2021-11-02
    • 2017-06-18
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多