scipy:基本澄清

时间:2012-06-26 22:36:31

标签: python scipy

我并不是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中做的那样。

谢谢!

4 个答案:

答案 0 :(得分:2)

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

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

  1. 支持高效修改的那些,例如DOK(密钥字典),LIL(列表列表)或COO(坐标列表)。这些通常用于构造矩阵。
  2. 支持高效访问和矩阵运算的那些,例如CSR(压缩稀疏行)或CSC(压缩稀疏列)。
  3. 协调列表(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)行的非零元素数)
    2. 因此,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]

      来源:https://en.wikipedia.org/wiki/Sparse_matrix

答案 1 :(得分:1)

稀疏矩阵主要包含零。 coo_matrixcsr_matrixcsc_matrix都是稀疏矩阵类。 coo_matrix是行,列,值的列表。这种类型的稀疏矩阵对于算术来说是低效的,因为如果你有一个带有大量零的大矩阵,你实际上并不想对所有那些零进行数学运算。您只想对稀疏矩阵中的非零值进行数学运算。 csr_matrixcsc_matrix是此问题的解决方案。 csrcsc实际上是三个具有非零值,列索引和行指针的1-D矩阵,而不是列出稀疏矩阵中的所有值({{1}告诉稀疏矩阵内非零值的位置。我不想重写教科书,所以这里是more info and an example

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

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