首页 > 解决方案 > 在 scipy 中连接稀疏矩阵中的特定行

问题描述

我有一个带有 I 行和 U 列的大型稀疏矩阵(使用 scipy.sparse),U 比 I 大得多。我有一个范围为 0:I 的 U 随机数列表。我想创建一个新的稀疏矩阵,它将是一个 U * U 稀疏矩阵,用户 u 的行将保存原始稀疏矩阵的第 i 行中的所有 U 值。例如,如果原始矩阵是 3*5 矩阵:

0,0,2,1,0
0,0,3,4,1
1,1,0,2,0

随机数列表为 [0,0,2,1,2]

结果矩阵应该是:

0,0,2,1,0
0,0,2,1,0
1,1,0,2,0
0,0,3,4,1
1,1,0,2,0

我现在正在使用这段代码,非常慢:

for u in range(U):
    i= random_indices[u]
    if u == 0:
        output_sparse_matrix = original_sparse_matrix[i, :]
    else:
        output_sparse_matrix = vstack((output_sparse_matrix,
                                       original_sparse_matrix[i, :]))

关于如何更快地完成此操作的任何建议?

更新 我使用了 Jérôme Richard 的建议,但在一个循环中 - 因为我遇到了内存不足的错误。这是有效的解决方案:

bins = np.array_split(random_indices, 10)
output_sparse_matrix = original_sparse_matrix[bins[0]]

for bin in bins[1:10]:
   output_sparse_matrix = vstack((output_sparse_matrix ,original_sparse_matrix[bin]))

标签: pythonnumpyscipysparse-matrix

解决方案


vstack为每次迭代创建一个新矩阵。这是减速的主要来源,因为算法的复杂性是O(U^3). 您可以将新行追加到 Python 列表中,然后追加行vstack列表。或者,更好的方法是使用以下 Numpy 表达式:

original_sparse_matrix[random_indices, :]


推荐阅读