一、稀疏矩阵转换成密度矩阵
稀疏矩阵没有特殊的,用三个np.array分别表示,row,column,和data表示稀疏矩阵;但稀疏矩阵转化成密集矩阵,需要快速转换,成熟的处理方法是scipy.sparse.coo_matrix类。
二、scipy.sparse.coo_matrix类定义
class scipy.sparse.coo_matrix(arg1, shape=None, dtype=None, copy=False)[source]
- A sparse matrix in COOrdinate format.
- Also known as the ‘ijv’ or ‘triplet’ format.
这可以通过多种方式实例化(instantiated ):
- coo_matrix(D) 具有密集矩阵D
- coo_matrix(S) 与另一个稀疏矩阵 S (equivalent to S.tocoo())
- coo_matrix((M, N), [dtype]) 构造一个形状为 (M, N) 的空矩阵 dtype 是可选的,默认为 dtype='d'
- coo_matrix((data, (i, j)), [shape=(M, N)])
-
从三个数组构造:
data[:] 矩阵的条目,以任意顺序
i[:] 矩阵条目的行索引
j[:] 矩阵条目的列索引
其中 A[i[k], j[k]] = data[k]。未指定形状时,从索引数组推断
注意:
稀疏矩阵可用于算术运算:它们支持加法、减法、乘法、除法和矩阵幂。
COO格式的优势
- 促进稀疏格式之间的快速转换
- 允许重复条目(参见示例)
- 与 CSR/CSC 格式之间的快速转换
COO格式的缺点
不直接支持:
- 算术运算
- 切片
预期用途
- COO 是一种用于构建稀疏矩阵的快速格式
- 构造矩阵后,转换为 CSR 或 CSC 格式以进行快速算术和矩阵向量运算
- 默认情况下,当转换为 CSR 或 CSC 格式时,重复的 (i,j) 条目将被汇总在一起。这有助于有效构建有限元矩阵等。 (见示例)
三、实例
3.1 生成空的矩阵
from scipy.sparse import coo_matrix import numpy as np mtrix = coo_matrix((3, 4), dtype=np.int8).toarray() print( mtrix )
>>>array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int8)
3.2 用ijv格式生成矩阵
from scipy.sparse import coo_matrix import numpy as np row = np.array([0, 3, 1, 0]) col = np.array([0, 3, 1, 2]) data = np.array([4, 5, 7, 9]) mtrix = coo_matrix((data, (row, col)), shape=(4, 4)).toarray() print( mtrix )
>>>array([[4, 0, 9, 0], [0, 7, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5]])
3.3 构造具有重复索引的矩阵
from scipy.sparse import coo_matrix
import numpy as np
row = np.array([0, 0, 1, 3, 1, 0, 0])
col = np.array([0, 2, 1, 3, 1, 0, 0])
data = np.array([1, 1, 1, 1, 1, 1, 1])
coo = coo_matrix((data, (row, col)), shape=(4, 4))
# Duplicate indices are maintained until implicitly or explicitly summed
# np.max(coo.data)
mtrix = coo.toarray()
print( mtrix )
array([[3, 0, 1, 0], [0, 2, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]])