11

我并不理解coo_matrix,csr_matrix和之间的区别csc_matrix

文档确实提到 coo_matrix 对于算术运算效率不高,我们需要将其转换为csror csc。我正在研究矩阵乘法。coo_matrix如果我只有 a并将其转换为csrorcsv矩阵,我不明白幕后发生了什么。

另外,如果我有类似的东西

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

4 回答 4

7

该术语不是由 python scipy 发明的,但已经存在于稀疏矩阵表示科学中

存在可以表示稀疏矩阵的各种格式。
格式可以分为两组:

  1. 支持高效修改的那些,例如 DOK(键字典)、LIL(列表列表)或 COO(坐标列表)。这些通常用于构建矩阵。
  2. 支持高效访问和矩阵运算的那些,例如 CSR(压缩稀疏行)或 CSC(压缩稀疏列)。

坐标列表(COO)

COO存储(行、列、值)元组的列表。理想情况下,对条目进行排序(按行索引,然后按列索引)以缩短随机访问时间。这是另一种有利于增量矩阵构造的格式

压缩稀疏行 (CSR)

压缩稀疏行 (CSR) 或压缩行存储 (CRS) 格式表示由三个(一维)数组组成的矩阵 M,它们分别包含非零值、行的范围和列索引。这种格式允许快速行访问和矩阵向量乘法。

CSR 格式使用三个(一维)数组(A、IA、JA)以行形式存储稀疏 m × n 矩阵 M。令 NNZ 表示 M 中非零条目的数量。(注意,此处应使用从零开始的索引。)

数组 A 的长度为 NNZ 并以从左到右从上到下(“行优先”)的顺序保存 M 的所有非零条目。

  1. 数组 IA 的长度为 m + 1。它由以下递归定义定义:
    IA[0] = 0
    IA[i] = IA[i - 1] + (第 (i - 1) 个非零元素的数量原始矩阵中的行)

因此,IA 的前 m 个元素存储 M 的每一行中第一个非零元素到 A 的索引,最后一个元素 IA[m] 存储 A 中的元素个数 NNZ,也可以认为是虚行的第一个元素在 A 中的索引,刚好超出矩阵 M 的末尾。
原始矩阵的第 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

于 2016-10-02T05:07:33.587 回答
1

稀疏矩阵主要包含零。coo_matrixcsr_matrix并且csc_matrix都是稀疏矩阵类。coo_matrix是行、列、值的列表。这种类型的稀疏矩阵对算术来说效率很低,因为如果你有一个包含很多零的大矩阵,你实际上并不想对所有这些零进行数学运算。您只想对稀疏矩阵中的非零值进行数学运算。csr_matrixcsc_matrix是这个问题的解决方案。而不是列出稀疏矩阵中的所有值,csr实际上csc是三个 1-D 矩阵,它们具有非零值、列索引和行指针 (for csr),它告诉非零值在稀疏矩阵中的位置矩阵。我不想重写教科书,所以这里有更多信息和示例

回答你的第二个问题。你想用scipy.sparse.dok_matrix. 这是一个基于键的稀疏矩阵字典。您可以编辑它 MATLAB 样式,然后将其转换为csrcsc用于算术。这是一个动态编辑的简单示例:

>>> A = scipy.sparse.dok_matrix((5,5))
>>> A[2,3] = 7
>>> print A
  (2, 3)      7.0
于 2012-06-27T02:52:09.367 回答
1

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
于 2018-04-21T09:25:54.453 回答
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]])

是 scipy 文档的链接

于 2013-07-13T19:26:08.527 回答