gpt4 book ai didi

python - 将稀疏 scipy 矩阵的行设置为零的最有效方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:12:37 26 4
gpt4 key购买 nike

我正在尝试将以下 MATLAB 代码转换为 Python,但我无法找到在任何合理时间内都能运行的解决方案。

M = diag(sum(a)) - a;
where = vertcat(in, out);
M(where,:) = 0;
M(where,where) = 1;

这里,a 是一个稀疏矩阵,where 是一个向量(输入/输出)。我使用 Python 的解决方案是:

M = scipy.sparse.diags([degs], [0]) - A
where = numpy.hstack((inVs, outVs)).astype(int)
M = scipy.sparse.lil_matrix(M)
M[where, :] = 0 # This is the slowest line
M[where, where] = 1
M = scipy.sparse.csc_matrix(M)

但是因为 A 是 334863x334863,所以这大约需要三分钟。如果有人对如何加快速度有任何建议,请贡献他们!相比之下,MATLAB 以难以察觉的速度执行同一步骤。

谢谢!

最佳答案

对 alko/seberg 的方法略有不同。我发现 for 循环令人不安,所以我今天早上大部分时间都在想办法摆脱它。以下并不总是比其他方法更快。归零的行越多,矩阵越稀疏,它的性能就越好:

def csr_zero_rows(csr, rows_to_zero):
rows, cols = csr.shape
mask = np.ones((rows,), dtype=np.bool)
mask[rows_to_zero] = False
nnz_per_row = np.diff(csr.indptr)

mask = np.repeat(mask, nnz_per_row)
nnz_per_row[rows_to_zero] = 0
csr.data = csr.data[mask]
csr.indices = csr.indices[mask]
csr.indptr[1:] = np.cumsum(nnz_per_row)

并测试这两种方法:

rows, cols = 334863, 334863
a = sps.rand(rows, cols, density=0.00001, format='csr')
b = a.copy()
rows_to_zero = np.random.choice(np.arange(rows), size=10000, replace=False)

In [117]: a
Out[117]:
<334863x334863 sparse matrix of type '<type 'numpy.float64'>'
with 1121332 stored elements in Compressed Sparse Row format>

In [118]: %timeit -n1 -r1 csr_rows_set_nz_to_val(a, rows_to_zero)
1 loops, best of 1: 75.8 ms per loop

In [119]: %timeit -n1 -r1 csr_zero_rows(b, rows_to_zero)
1 loops, best of 1: 32.5 ms per loop

当然还有:

np.allclose(a.data, b.data)
Out[122]: True

np.allclose(a.indices, b.indices)
Out[123]: True

np.allclose(a.indptr, b.indptr)
Out[124]: True

关于python - 将稀疏 scipy 矩阵的行设置为零的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19784868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com