我不是undetstanding之间的差别coo_matrix,csr_matrix并csc_matrix.
文档确实提到coo_matrix对算术运算效率不高,我们需要将其转换为csr或csc.我正在寻找矩阵乘法.我不明白发生了什么幕后,如果我只是有一个coo_matrix并将其转换为csr或csv矩阵.
如果我有类似的东西
A = array([[1,2,3,0,0,5],
[5,0,0,1,2,0]])
print coo_matrix(A)
Run Code Online (Sandbox Code Playgroud)
它打印
(0, 0) 1
(0, 1) 2
(0, 2) 3
(0, 5) 5
Run Code Online (Sandbox Code Playgroud)
这很酷.但有没有办法,我可以直接输入我的矩阵作为打印的矩阵.类似于定义一个空COO矩阵,然后开始定义coo_matrix类似于我们在matlab中的操作方式的东西.
谢谢!
该术语不是由 python scipy 发明的,而是已经存在于稀疏矩阵表示科学中
存在可以表示稀疏矩阵的各种格式。
格式可以分为两类:
坐标列表 (COO)
COO存储(行、列、值)元组的列表。理想情况下,条目被排序(按行索引,然后是列索引)以提高随机访问时间。这是另一种适用于增量矩阵构建的格式
压缩稀疏行 (CSR)
压缩稀疏行 (CSR) 或压缩行存储 (CRS) 格式用三个(一维)数组表示矩阵 M,分别包含非零值、行的范围和列索引。这种格式允许快速行访问和矩阵向量乘法。
CSR 格式使用三个(一维)数组(A、IA、JA)以行形式存储一个稀疏的 m×n 矩阵 M。让 NNZ 表示 M 中非零条目的数量。(请注意,此处应使用从零开始的索引。)
数组 A 的长度为 NNZ 并以从左到右从上到下(“行优先”)的顺序保存 M 的所有非零条目。
因此,IA的前m个元素存储M的每一行第一个非零元素的A的索引,最后一个元素IA[m]存储A中元素的个数NNZ,也可以认为是在矩阵 M 末尾的幻像行的第一个元素的 A 中的索引。
原始矩阵的第 i 行的值从元素 A[IA[i]] 到 A[IA[i + 1] ? 1](包括两端),即从一行的开始到下一行开始之前的最后一个索引。
第三个数组 JA 包含 A 的每个元素在 M 中的列索引,因此长度也是 NNZ。
例如,矩阵 0 0 0 0
5 8 0 0
0 0 3 0
0 6 0 0
是具有 4 个非零元素的 4 × 4 矩阵,因此
A = [ 5 8 3 6 ]
IA = [ 0 0 2 3 4 ]
JA = [ 0 1 2 1 ]
来源:https : //en.wikipedia.org/wiki/Sparse_matrix
小智 1
稀疏矩阵主要包含零。coo_matrix、csr_matrix和csc_matrix都是稀疏矩阵类。这coo_matrix是行、列、值的列表。这种类型的稀疏矩阵对于算术来说效率低下,因为如果你有一个包含很多零的大矩阵,你实际上不想对所有这些零进行数学运算。您只想对稀疏矩阵中的非零值进行数学运算。和csr_matrix是csc_matrix这个问题的解决方案。不是列出稀疏矩阵中的所有值,csr而是csc实际上是三个一维矩阵,它们具有非零值、列索引和行指针(对于csr),该指针指示非零值在稀疏矩阵中的位置矩阵。我不想重写教科书,所以这里有更多信息和示例。
回答你的第二个问题。你想用scipy.sparse.dok_matrix. 这是基于稀疏矩阵的键字典。您可以对其进行 MATLAB 样式编辑,然后将其转换为csr或csc进行算术运算。这是动态编辑的一个简单示例:
>>> A = scipy.sparse.dok_matrix((5,5))
>>> A[2,3] = 7
>>> print A
(2, 3) 7.0
Run Code Online (Sandbox Code Playgroud)