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