scipy:基本说明

piah890a  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(119)

我不明白coo_matrixcsr_matrixcsc_matrix之间的区别。
文档中提到coo_matrix对于算术运算效率不高,我们需要将其转换为csrcsc。我正在研究更多的矩阵乘法。如果我只是有一个coo_matrix,并将其转换为csrcsv矩阵,我不明白幕后发生了什么。
同样如果我有

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中做的那样。
谢谢你!

myss37ts

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

72qzrwbm

72qzrwbm2#

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

csr_matrixcsc_matrix均针对高效访问、矩阵操作(如行/列切片)和矢量操作进行了优化。
coo_matrix已优化为构造稀疏矩阵。它在内部与csr_matrix不同,但当您简单打印时,它看起来相同。

klsxnrf1

klsxnrf13#

稀疏矩阵大部分包含零。coo_matrixcsr_matrixcsc_matrix都是稀疏矩阵类。coo_matrix是行、列和值的列表。这种类型的稀疏矩阵对于算术来说是低效的,因为如果您有一个包含许多零的大型矩阵,你实际上并不想计算所有的零,你只想计算稀疏矩阵中的非零值,csr_matrixcsc_matrix就是这个问题的解。csrcsc实际上是三个1-D矩阵,它们具有非零值、列索引和行指针,而不是列出稀疏矩阵中的所有值(对于csr),它告诉我们非零值在稀疏矩阵中的位置。我不想重写教科书,所以这里有更多的信息和一个例子。
回答你的第二个问题。你想使用scipy.sparse.dok_matrix。这是一个基于键的稀疏矩阵字典。你可以用MATLAB风格编辑它,然后将其转换为csrcsc进行算术运算。下面是一个动态编辑的简单示例:

>>> A = scipy.sparse.dok_matrix((5,5))
>>> A[2,3] = 7
>>> print A
  (2, 3)      7.0
fbcarpbf

fbcarpbf4#

我想你在找的是这样的东西:

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文档的链接

相关问题