1、 scipy中常用的数据结构

1.1 scipy.sparse.coo_matrix

coo_matrix全称是A sparse matrix in Coordinate format, 一种基于坐标格式的系数矩阵, 每个矩阵时一个三元组(行, 列, 值)

构造方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy as np
from scipy.sparse import coo_matrix
coo = coo_matrix(np.array([1, 0, 3, 0, 5, 6]).reshape(2, 3))
print(coo)
"""
(0, 0) 1
(0, 1) 2
(0, 2) 3
(1, 0) 4
(1, 1) 5
(1, 2) 6
coo_matrix中值表示非零元素, 如果该位置是0, 则没有改行的数值
如, 当输入的array是[1, 0, 3, 0, 5]
(0, 0) 1
(0, 2) 3
(1, 1) 5
(1, 2) 6
"""
# 第二种方法
row = np.array([0, 3, 1, 0])
col = np.array([0, 3, 1, 2])
data = np.array([4, 5, 7, 9])
coo_matrix_1 = coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
print(coo_matrix_1)
"""
coo_matrix((data, (i, j)), [shape=(M, N)])
data即矩阵存储的数据,i为行下标,j为列下标,
data,i,j的关系为:A[i[k], j[k]] = data[k]
0行0列是4, 3行3列是5, 以此类推
[[4 0 9 0]
[0 7 0 0]
[0 0 0 0]
[0 0 0 5]]
"""

1.2 scipy.sparse.csr_matrix

csr是Compressed Sparse Row matrix的缩写, 即基于行存储的压缩稀疏矩阵,

有几种不同的构造方法, csr_matrix(D), D是一个稠密矩阵或2维的ndarray

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from scipy.sparse import csr_matrix
csr = csr_matrix(np.array([1, 2, 3, 4, 5, 6]).reshape(2, 3))
"""
其实跟coo_matrix很像
(0, 0) 1
(0, 1) 2
(0, 2) 3
(1, 0) 4
(1, 1) 5
(1, 2) 6

"""
# csr_matrix((M, N), [dtype])构造一个shape为(M, N)的dtype类型的空矩阵
csr_matrix_1 = csr_matrix((3, 4), dtype=np.int8).toarray()
print(csr_matrix_1)
""""
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
"""
# 这种方法跟coo_matrix中的也是一样的
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
csr_matrix_2 = csr_matrix((data, (row, col)), shape=(3, 3)).toarray()
print(csr_matrix_2)
"""
[[1 0 2]
[0 0 3]
[4 5 6]]

按行存储,即先存储第0行,然后第1行,依次到最后一行,即先扫描row数组的数据,第一个数据是0即第0行,然后扫描col的第一个数据是0即第0列,那么第0行第0列存储的值就是data的第一个数据即1,然后继续扫描row的第二个数据还是0即还是第0行,col对应的第二个数据是2即第2列,data的第二个数据是2,即第0行第2列的数据是2,依次扫描row,找对应的col和data构造稀疏矩阵。
"""