我有一个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)
这是进行这种转变的最佳方式吗?
答案 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上三角索引,这可能是大数组的瓶颈。