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
。
您的报价来自tocsr
。 dok
版本的实际代码是
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矩阵转换文档不清楚的主要内容,如果未能解决你的问题,请参考以下文章