【问题标题】:Fastest way to go through a CSR matrix通过 CSR 矩阵的最快方法
【发布时间】:2016-10-08 16:55:46
【问题描述】:

我有这个代码:

from itertools import product    
from numpy import zeros
Ysys = zeros((2*n_bus, 2*n_bus))
for a, b in product(range(n_bus), range(n_bus)):
    Ysys[2*a, 2*b] = Yseries[a, b].real
    Ysys[2*a, 2*b+1] = -Yseries[a, b].imag
    Ysys[2*a+1, 2*b] = Yseries[a, b].imag
    Ysys[2*a+1, 2*b+1] = Yseries[a, b].real

Yseries 是一个由n_bus 乘以n_bus 维度的稀疏方阵,其中包含复数。本质上,我想将复杂矩阵“分解”为浮点矩阵。

我的 for 循环效率低下,因为我应该提前知道每个数据条目的行、列坐标。理想情况下,a 是一个包含每个条目的所有行坐标的数组,b 应该是一个包含每个条目的所有列坐标的数组。

我的问题是我不理解我的 CSR matrx Yseries 中包含的数组 indicesindptr

不管我说了什么,我都非常感谢有关如何矢量化 for 循环的指示。

【问题讨论】:

    标签: scipy sparse-matrix


    【解决方案1】:

    我通过将矩阵传递给COO稀疏类型来解决它:

    m = Yseries.tocoo()
    a = m.row
    b = m.col
    Ysys[2 * a, 2 * b] = m.data.real
    Ysys[2 * a, 2 * b + 1] = -m.data.imag
    Ysys[2 * a + 1, 2 * b] = m.data.imag
    Ysys[2 * a + 1, 2 * b + 1] = m.data.real
    

    测量执行时间后,维度 = 30 我得到:

    • For 循环(原始问题):0.06154400000000004 秒
    • 矢量化(此答案):0.00011099999999997223 秒

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多