通过CSR矩阵的最快方法

时间:2016-10-08 16:55:46

标签: scipy sparse-matrix

我有这段代码:

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_busn_bus维的方形稀疏矩阵。基本上我想将复杂矩阵“爆炸”成浮点矩阵。

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

我的问题是我不理解CSR matrx indices中包含的数组indptrYseries

无论我说过什么,我都很欣赏如何对for循环进行矢量化。

1 个答案:

答案 0 :(得分: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 loop(原始问题):0.06154400000000004 s
  • 矢量化(此答案):0.00011099999999997223 s