用 1 填充 Scipy 稀疏矩阵

Fill Scipy Sparse Matrix with Ones

我有一个 scipy 稀疏矩阵,我想将其值替换为:

from scipy import sparse
import numpy as np

data = np.array([[1, 2, 3, 0, 5], [6, 0, 0, 9, 10], [0, 0, 0, 0, 15]])

print sparse.coo_matrix(data)

我看到 numpy 有一个 ones_like() 函数,但这并没有解决我的问题。

输出应如下所示:

(0, 0)        1
(0, 1)        1
(0, 2)        1
(0, 4)        1
(1, 0)        1
(1, 3)        1
(1, 4)        1
(2, 4)        1

最简单的方法是直接操作稀疏矩阵表示。这样做的方式将取决于您选择的代表;对于 COO 格式,它将是

data.data[:] = 1

请注意,COO 格式有一个奇怪的功能,它允许重复条目。如果 COO 矩阵在 (1, 1) 位置有两个条目,上面的代码会将这两个条目设置为 1,如果您将矩阵转换为另一种格式,则会导致单个条目 2 .如果您想要 1 的单个条目,则可以先规范化重复项

data.sum_duplicates()
data.data[:] = 1

如果您只需要将它们放在矩阵的某些列中,您可以使用 scipy.sparse getnnz 函数执行它。 在沿 axis=1 的所选列中使用该函数,您可以获得一个新列,其中只有一个在相应的位置。

data[:,col] = csc_matrix(data[:,col].getnnz(axis=1)).T

当然,把csc_matrix换成你用的稀疏类型,但是考虑到切片cols在csc_matrix中效率更高,所以考虑把你的矩阵改成csc_matrix 在执行此操作之前(如果您有 csr_matrix 您可以修改此算法以在行中循环)。