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
的基础数据结构是 dict
,coo
3 个 numpy 数组。不复制数据就无法转换。
他们对此处的文档草率,只是从通用模板中复制它。 copy
参数在进行“同类转换”时是相关的,例如dok.todok()
或 coo.tocoo()
。但是跨格式的应用程序几乎总是一个副本——我使用 'nearly' 因为我不确定一些像 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 中将 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
的基础数据结构是 dict
,coo
3 个 numpy 数组。不复制数据就无法转换。
他们对此处的文档草率,只是从通用模板中复制它。 copy
参数在进行“同类转换”时是相关的,例如dok.todok()
或 coo.tocoo()
。但是跨格式的应用程序几乎总是一个副本——我使用 'nearly' 因为我不确定一些像 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