scipy:基本澄清

Gau*_*rav 8 python scipy

我不是undetstanding之间的差别coo_matrix,csr_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)
Run Code Online (Sandbox Code Playgroud)

它打印

  (0, 0)    1
  (0, 1)    2
  (0, 2)    3
  (0, 5)    5
Run Code Online (Sandbox Code Playgroud)

这很酷.但有没有办法,我可以直接输入我的矩阵作为打印的矩阵.类似于定义一个空COO矩阵,然后开始定义coo_matrix类似于我们在matlab中的操作方式的东西.

谢谢!

Pra*_*wal 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,也可以认为是在矩阵 M 末尾的幻像行的第一个元素的 A 中的索引。
原始矩阵的第 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


小智 1

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

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

>>> A = scipy.sparse.dok_matrix((5,5))
>>> A[2,3] = 7
>>> print A
  (2, 3)      7.0
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的。`coo_matrix` 不存储零条目。 (2认同)