scipy 矩阵转换文档不清楚

scipy matrix conversion documentation is unclear

我在 scipy 中将 dok 转换为 coo 矩阵,文档对我来说似乎不清楚。 我的目标是不破坏原来的矩阵! 文档指出:

Convert this matrix to Compressed Sparse Row format. With copy=False, the data/indices may be shared between this matrix and the resultant csr_matrix.

然而它似乎输出矩阵而不是转换原始矩阵。 我认为“复制”可能会改变从转换到创建副本的行为,但测试表明这不是真的。我的程序有很长的运行时间,所以我不想在导出之前不小心破坏矩阵:)

mat = scipy.sparse.dok_matrix((10,10),dtype=np.int16)
type(mat)

coo = mat.tocoo(copy=True)
print(type(mat))

print(type(coo))

coo = mat.tocoo(copy=False)
print(type(mat))

print(type(coo))

谢谢!

您不必为此担心,您的 dok.tocoo 将始终是副本。此外,像这样的方法总是 return 一个新矩阵;他们不就地运作。共享适用于存储值和索引的底层数据结构,仅当它们足够相似时才适用。

dok 的基础数据结构是 dictcoo 3 个 numpy 数组。不复制数据就无法转换。

他们对此处的文档草率,只是从通用模板中复制它。 copy 参数在进行“同类转换”时是相关的,例如dok.todok()coo.tocoo()。但是跨格式的应用程序几乎总是一个副本——我使用 'nearly' 因为我不确定一些像 csr.tocsc.

如果您编写的函数采用任何格式的稀疏矩阵,并且需要确保它是 coo,您可能需要使用

 M1 = M.tocoo(copy=True)

确保 M1 的任何更改不会出现在 M 中,即使 M 已经是 coo


您的引述来自 tocsrdok 版本的实际代码是

self.tocoo(copy=copy).tocsr(copy=False)

首先将 dok 转换为常见的 coo 格式,然后从那里转换为 csr(或其他格式之一)。

dok.tocoo 的代码是:

def tocoo(self, copy=False):
    from .coo import coo_matrix
    if self.nnz == 0:
        return coo_matrix(self.shape, dtype=self.dtype)

    idx_dtype = get_index_dtype(maxval=max(self.shape))
    data = np.fromiter(self.values(), dtype=self.dtype, count=self.nnz)
    row = np.fromiter((i for i, _ in self.keys()), dtype=idx_dtype, count=self.nnz)
    col = np.fromiter((j for _, j in self.keys()), dtype=idx_dtype, count=self.nnz)
    A = coo_matrix((data, (row, col)), shape=self.shape, dtype=self.dtype)
    A.has_canonical_format = True
    return A