将对称矩阵变换为稀疏矩阵

时间:2017-11-09 14:33:54

标签: python-2.7 numpy matrix sparse-matrix

我有一个numpy symmetric square matrix,我想变成一个稀疏的,到目前为止,我已经意识到以下解决方案,为简化起见,我使用以下命令构建了一个矩阵:

import numpy as np
adjacency_matrix = np.full((10, 10), 20.0)

然后进行处理以将其变为稀疏的,如下所示:

nbr_lines, nbr_columns = adjacency_matrix.shape
for i in xrange(height):
   for j in xrange(i+1):
       adjacency_matrix[i, j] = 0
adjacency_matrix = sparse.csr_matrix(adjacency_matrix)

这是进行这种转变的最佳方式吗?

1 个答案:

答案 0 :(得分:1)

方法#1

你可以用np.triu_indices获得所有那些上三角形索引,一次创建稀疏矩阵,就像这样 -

r,c = np.triu_indices(height,1)
out = sparse.csr_matrix((adjacency_matrix[r,c], (r,c)))

方法#2

或者,我们可以重置那些下三角形元素(就像你正在做的那样,但是以带有遮罩的矢量化方式),就像这样 -

m = np.arange(height)
adjacency_matrix[m[:,None] >= m] = 0

然后,使用sparse.csr_matrix(adjacency_matrix)创建稀疏矩阵。

优点是我们避免创建所有row,col上三角索引,这可能是大数组的瓶颈。