我并不是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中做的那样。
谢谢!
答案 0 :(得分:2)
术语不是由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]存储NNZ,即A中的元素个数,也可以认为作为矩阵M的末端之外的虚线行的第一个元素的A中的索引。
从元素A [IA [i]]中读取原始矩阵的第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]
答案 1 :(得分:1)
稀疏矩阵主要包含零。 coo_matrix
,csr_matrix
和csc_matrix
都是稀疏矩阵类。 coo_matrix
是行,列,值的列表。这种类型的稀疏矩阵对于算术来说是低效的,因为如果你有一个带有大量零的大矩阵,你实际上并不想对所有那些零进行数学运算。您只想对稀疏矩阵中的非零值进行数学运算。 csr_matrix
和csc_matrix
是此问题的解决方案。 csr
和csc
实际上是三个具有非零值,列索引和行指针的1-D矩阵,而不是列出稀疏矩阵中的所有值({{1}告诉稀疏矩阵内非零值的位置。我不想重写教科书,所以这里是more info and an example。
回答你的第二个问题。您想使用csr
。这是一个基于密钥的稀疏矩阵字典。您可以将其编辑为MATLAB样式,然后将其转换为scipy.sparse.dok_matrix
或csr
进行算术运算。这是一个动态编辑的简单示例:
csc
答案 2 :(得分:0)
我认为你正在寻找这样的东西:
row = np.array([0,0,0,0])
col = np.array([0,1,2,5])
data = np.array([1,2,3,5])
coo_matrix((data,(row,col))).todense()
给出了:
matrix([[1, 2, 3, 0, 0, 5]])
Here是scipy文档的链接
答案 3 :(得分:0)
csr_matrix
首先考虑行,csc_matrix
首先考虑列。
这是一个简单的例子来说明: 我们拿一个矩阵,
mat = [[1, 0, 0],
[5, 0, 2],
[0, -1, 0],
[0, 0, 3]]
csr_matrix首先给出行中非零元素的位置,然后到第二行,然后到第三行,依此类推。 例如, csr_matrix(mat)返回:
(0, 0) 1.0 -- first row
(1, 0) 5.0 -- second row
(1, 2) 2.0 -- second row
(2, 1) -1.0 --third row
(3, 2) 3.0 -- fourth row
类似地,csc_matrix给出第一列中非零元素的位置,然后是第二列,依此类推。
(0, 0) 1.0 -- first column
(1, 0) 5.0 -- first column
(2, 1) -1.0 -- second column
(1, 2) 2.0 -- third column
(3, 2) 3.0 -- third column