scipy矩阵转换文档不清楚

Posted

技术标签:

【中文标题】scipy矩阵转换文档不清楚【英文标题】:scipy matrix conversion documentation is unclear 【发布时间】:2021-12-19 12:16:17 【问题描述】:

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

将此矩阵转换为压缩稀疏行格式。 使用 copy=False,数据/索引可以在此矩阵和生成的 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))

谢谢!

【问题讨论】:

矩阵对象是指包含非零矩阵条目、这些条目的位置等的数组。我认为复制确定是否复制这些其他数组,或者两个矩阵是否尽可能引用相同的底层数组.尝试在一个矩阵的实验中更改 mat.data,看看它是否会影响另一个矩阵中的 mat.data 【参考方案1】:

您不必担心这一点,您的dok.tocoo 将永远是一个副本。此外,像这样的方法总是返回一个新矩阵;他们不会就地运作。共享适用于存储值和索引的底层数据结构,前提是它们足够相似。

dok 的底层数据结构是dict,用于coo 3 个numpy 数组。不复制数据就无法进行转换。

他们对这里的文档很草率,只是从通用模板中复制它。 copy 参数在进行“同类转换”时是相关的,例如dok.todok()coo.tocoo()。但是跨格式的应用程序几乎总是一个副本 - 我使用“几乎”,因为我不确定像 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

【讨论】:

以上是关于scipy矩阵转换文档不清楚的主要内容,如果未能解决你的问题,请参考以下文章

如何将“SciPy 稀疏矩阵”转换为“NumPy 矩阵”?

将 Python 字典列表转换为 SciPy 稀疏矩阵

优化 Scipy 稀疏矩阵

我如何矢量化矩阵/输入,以便scipy.optimize.minimize可以使用它?

Scipy 稀疏矩阵作为 DataFrame 列

哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?