我有这段代码:
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 indices
中包含的数组indptr
和Yseries
。
无论我说过什么,我都很欣赏如何对for循环进行矢量化。
答案 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,我得到: