Python 从scipy中的稀疏矩阵连接特定行

Python 从scipy中的稀疏矩阵连接特定行,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,我有一个大的稀疏矩阵(使用scipy.sparse),有I行和U列,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 我现在使用的代码非常慢:

我有一个大的稀疏矩阵(使用scipy.sparse),有I行和U列,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]))

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


原始稀疏矩阵[随机索引:]
vstack
为每次迭代创建一个新矩阵。这是速度减慢的主要原因,因为算法的复杂性是
O(U^3)
。您只需将新行附加到Python列表中,然后
vstack
行列表。或者,更好的方法只是使用以下Numpy表达式:


原始稀疏矩阵[随机索引,:]

这可能不会更快,但您可以尝试使用奇特的索引:

output_sparse_matrix = input_sparse_matrix[random_indices]
如果随机_指数是一个列表,则上面应该给出所需的结果

将此应用于原始示例:

from scipy.sparse import csr_matrix

a = csr_matrix([[0,0,2,1,0],
[0,0,3,4,1],
[1,1,0,2,0]])

indices =  [0,0,2,1,2]


output_matrix = a[indices]

print(output_matrix.todense())


这可能不会更快,但您可以尝试使用奇特的索引:

output_sparse_matrix = input_sparse_matrix[random_indices]
如果随机_指数是一个列表,则上面应该给出所需的结果

将此应用于原始示例:

from scipy.sparse import csr_matrix

a = csr_matrix([[0,0,2,1,0],
[0,0,3,4,1],
[1,1,0,2,0]])

indices =  [0,0,2,1,2]


output_matrix = a[indices]

print(output_matrix.todense())


您正在使用
numpy
?或者
scipy.sparse
?我使用scipy.sparseen,即使是密集数组,在循环中重复执行串联也是很慢的。在这里,我们建议将数组收集到一个列表中,并在最后进行一次连接。我没有玩过很多
sparse.vstack
,但我认为同样的情况也适用于
sparse.vstack
组合其参数的
coo
属性,并使用它们来创建一个新的
coo
矩阵。查看
sparse.vstack
的代码。它将任务委托给
sparse.bmat
bmat([[b]表示块中的b])
。是否使用
numpy
?或者
scipy.sparse
?我使用scipy.sparseen,即使是密集数组,在循环中重复执行串联也是很慢的。在这里,我们建议将数组收集到一个列表中,并在最后进行一次连接。我没有玩过很多
sparse.vstack
,但我认为同样的情况也适用于
sparse.vstack
组合其参数的
coo
属性,并使用它们来创建一个新的
coo
矩阵。查看
sparse.vstack
的代码。它将任务委托给
sparse.bmat
bmat([[b]表示块中的b])
。我得到一个错误:ValueError:不允许负维度,尽管没有一个随机索引是负的(所有索引都在0到999之间)。我得到一个错误:ValueError:不允许负维度,虽然没有任何随机索引是负的(所有索引都在0和999之间),但我得到了一个错误:ValueError:不允许负维度,尽管没有任何随机索引是负的(所有索引都在0和999之间)。我知道这一行的错误,或者你对结果做了什么?这里甚至允许负指数。唯一可能的故障是显式超出范围错误或内存不足。是-此行。可能是内存不足。我收到一个错误:ValueError:不允许负维度,尽管没有任何随机索引是负的(所有索引都在0到999之间)。我知道这一行的错误,或者你对结果做了什么?这里甚至允许负指数。唯一可能的故障是显式超出范围错误或内存不足。是-此行。可能是记忆不足