Python scipy:基本澄清

Python scipy:基本澄清,python,scipy,Python,Scipy,我不理解coo_矩阵、csr_矩阵和csc_矩阵之间的区别 文档中确实提到了coo_矩阵对于算术运算是无效的,我们需要将其转换为csr或csc。我正在研究矩阵乘法。如果我只是有一个coo_矩阵并将其转换为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

我不理解
coo_矩阵
csr_矩阵
csc_矩阵
之间的区别

文档中确实提到了coo_矩阵对于算术运算是无效的,我们需要将其转换为
csr
csc
。我正在研究矩阵乘法。如果我只是有一个
coo_矩阵
并将其转换为
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_矩阵的值,就像我们在matlab中所做的那样


谢谢

稀疏矩阵主要包含零
coo_矩阵
csr_矩阵
csc_矩阵
都是稀疏矩阵类。
coo_矩阵
是行、列、值的列表。这种稀疏矩阵的运算效率很低,因为如果你有一个包含很多零的大型矩阵,你实际上不想对所有这些零进行运算。您只需要对稀疏矩阵中的非零值进行数学运算。
csr\u矩阵
csc\u矩阵
就是这个问题的解决方案。与列出稀疏矩阵中的所有值不同,
csr
csc
实际上是三个一维矩阵,它们具有非零值、列索引和行指针(对于
csr
),指示非零值在稀疏矩阵中的位置。我不想重写教科书,所以这里是

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

>>> A = scipy.sparse.dok_matrix((5,5))
>>> A[2,3] = 7
>>> print A
  (2, 3)      7.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]])

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

稀疏矩阵可以用各种格式表示
格式可分为两组:

  • 支持高效修改的工具,如DOK(键字典)、LIL(列表列表)或COO(坐标列表)。这些通常用于构造矩阵
  • 支持高效访问和矩阵操作的,如CSR(压缩稀疏行)或CSC(压缩稀疏列)
  • 协调列表(COO)

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

    压缩稀疏行(CSR)

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

    CSR格式使用三个(一维)数组(a、IA、JA)以行形式存储稀疏的m×n矩阵m。设NNZ表示M中非零项的数量。(注意,此处应使用基于零的索引。)

    数组A的长度为NNZ,并以从左到右的自上而下(“行主”)顺序保存M的所有非零项

  • 数组IA的长度为m+1。它由以下递归定义定义:
    IA[0]=0
    IA[i]=IA[i− 1] +(i)上非零元素的数量− 1) -原始矩阵中的第行)
  • 因此,IA的前m个元素将索引存储到m的每一行中的第一个非零元素的A中,最后一个元素IA[m]存储A中元素的数量NNZ,也可以将其视为矩阵M末尾之外的幻影行的第一个元素的索引。
    原始矩阵的第i行的值从元素A[IA[i]]读取到A[IA[i+1]− 1] (包括两端),即从一行开始到下一行开始之前的最后一个索引

    第三个数组JA包含A的每个元素的以M为单位的列索引,因此其长度也为NNZ

    例如,矩阵 0
    5800
    030
    0600

    是具有4个非零元素的4×4矩阵,因此

    A=[5 8 3 6]
    IA=[0 2 3 4]
    JA=[01 2 1]


    <源>: <代码> cSrh矩阵< /C> >考虑行第一和<代码> CSCHOLL矩阵< /代码>首先考虑列。 下面是一个简单的例子来说明: 让我们用一个矩阵,

    mat = [[1, 0, 0],
           [5, 0, 2],
           [0, -1, 0],
           [0, 0, 3]]
    
    csr_矩阵首先给出非零元素在行中的位置,然后进入第二行,然后进入第三行,依此类推。 例如, csr_矩阵(mat)返回:

    类似地,csc_矩阵给出了非零元素在第一列、第二列中的位置,依此类推

    (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_矩阵和csc_矩阵?这是错误的
    coo_矩阵
    不存储零项。
    (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