我不明白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)
它打印
(0, 0) 1
(0, 1) 2
(0, 2) 3
(0, 5) 5
这很酷。但是有没有办法,我可以直接输入我的矩阵作为打印出来的矩阵。比如定义一个空的COO矩阵,然后开始定义coo_matrix
的值,就像我们在matlab中做的那样。
谢谢你!
4条答案
按热度按时间myss37ts1#
这个术语不是由python scipy发明的,而是已经存在于稀疏矩阵表示科学中
存在可以表示稀疏矩阵的各种格式。
格式可分为两组:
1.支持有效修改的列表,如DOK(关键字字典)、LIL(列表列表)或COO(坐标列表)。这些列表通常用于构建矩阵。
1.支持高效访问和矩阵运算的那些,如CSR(压缩稀疏行)或CSC(压缩稀疏列)。
协调人名单(COO)
COO存储(行,列,值)元组的列表。理想情况下,对条目进行排序(先按行索引,再按列索引)以提高随机访问时间。这是另一种适合增量矩阵构造的格式
压缩的稀疏行(CSR)
压缩的稀疏行(CSR)或压缩的行存储(CRS)格式表示矩阵M乘以三个(一维)数组,这些数组分别包含非零值、行区和列索引。此格式允许快速行访问和矩阵向量乘法。
CSR格式使用三个(一维)数组(A,IA,JA)以行的形式存储一个稀疏的m × n矩阵M,令NNZ表示M中非零项的个数(注意,这里应该使用从零开始的索引)。
数组A的长度为NNZ,并以从左到右、从上到下(“行主”)的顺序保存M的所有非零项。
1.数组IA的长度为m + 1。它由以下递归定义定义:
I_A [0] = 0
IA[i] = IA[i − 1] +(原始矩阵中第i − 1行的非零元素个数)
因此,IA的前m个元素存储M的每行中的第一个非零元素在A中的索引,并且最后一个元素IA[m]存储NNZ,即A中的元素的数目,其也可以被认为是刚好超出矩阵M的末尾的假想行的第一个元素在A中的索引。
原始矩阵的第i行的值从元素A[IA[i]]到A[IA[i + 1] − 1](包括两端)读取,即从一行的开始到下一行开始之前的最后一个索引。
第三个数组JA包含A的每个元素的M中的列索引,因此长度也是NNZ。
例如,矩阵0 0 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
72qzrwbm2#
csr_matrix
首先考虑行,而csc_matrix
首先考虑列。这里有一个简单的例子来说明:让我们看一个矩阵,
csr_matrix首先给出行中非零元素的位置,然后转到第二行,再转到第三行,依此类推。例如,csr_matrix(mat)返回:
类似地,csc_matrix给出第一列中非零元素的位置,然后是第二列,依此类推。
csr_matrix
和csc_matrix
均针对高效访问、矩阵操作(如行/列切片)和矢量操作进行了优化。coo_matrix
已优化为构造稀疏矩阵。它在内部与csr_matrix
不同,但当您简单打印时,它看起来相同。klsxnrf13#
稀疏矩阵大部分包含零。
coo_matrix
、csr_matrix
和csc_matrix
都是稀疏矩阵类。coo_matrix
是行、列和值的列表。这种类型的稀疏矩阵对于算术来说是低效的,因为如果您有一个包含许多零的大型矩阵,你实际上并不想计算所有的零,你只想计算稀疏矩阵中的非零值,csr_matrix
和csc_matrix
就是这个问题的解。csr
和csc
实际上是三个1-D矩阵,它们具有非零值、列索引和行指针,而不是列出稀疏矩阵中的所有值(对于csr
),它告诉我们非零值在稀疏矩阵中的位置。我不想重写教科书,所以这里有更多的信息和一个例子。回答你的第二个问题。你想使用
scipy.sparse.dok_matrix
。这是一个基于键的稀疏矩阵字典。你可以用MATLAB风格编辑它,然后将其转换为csr
或csc
进行算术运算。下面是一个动态编辑的简单示例:fbcarpbf4#
我想你在找的是这样的东西:
其给出:
Here是指向scipy文档的链接