正确理解scipy中的coo_matrix函数
1. 构造一个空矩阵
这种用法比较简单,直接生成一个给定维度的矩阵,并且可以指定元素类型。
如下指定生成一个(3,4)
且数据类型为int8
的矩阵
import scipy.sparse as sp
sp.coo_matrix((3, 4), dtype=np.int8).toarray()
output:
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int8)
2. 使用ijv(triplet)格式构造一个矩阵
- data[:] 就是原始矩阵中的数据,例如上面的4,5,7,9;
- i[:] 就是行的指示符号;例如上面row的第0个元素是0,就代表data中第一个数据在第0行;
- j[:] 就是列的指示符号;例如上面col的第0个元素是0,就代表data中第一个数据在第0列;
data中的数据刚好存在如下关系:
4:第0行第0列
5:第3行第3列
7:第1行第1列
9:第0行第2列
然后其余元素全部填充为0
row = np.array([0, 3, 1, 0])
col = np.array([0, 3, 1, 2])
data = np.array([4, 5, 7, 9])
coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
output:
array([[4, 0, 9, 0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
3. 用重复的索引构造矩阵
第三种看文档我当时看了半天,泪崩~
怎么理解呢?如下:
同样,data中的元素仍然是作为数据,row和col仍然构成数据在矩阵中的下标。
重复咋整啊???
看到反复提到duplicate
还有summed
关键字的注释,大概就懂了。
也就是说如果row和col仍然构成数据在矩阵中的下标出现了重复情况,那么直接把这些下标下的value进行叠加,最终的和放入该位置即可。
例如:
data中的第一个元素为1,对应的row和col为(0,0),故存放在第0行第0列位置
...
data中的第6个元素为1,对应的row和col为(0,0),故存放在第0行第0列位置
data中的第7个元素为1,对应的row和col为(0,0),故存放在第0行第0列位置
按照规则,直接进行累加:1+1+1 = 3
所以最终第0行第0列存放元素为3
以此类推...
# Constructing a matrix with duplicate indices
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 = sp.coo_matrix((data, (row, col)), shape=(4, 4))
# Duplicate indices are maintained until implicitly or explicitly summed
np.max(coo.data)
coo.toarray()
output:
array([[3, 0, 1, 0],
[0, 2, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 1]])
更多细节可以查看coo_matrix函数
当然,以上仅为个人参照官方文档的一点总结,可能个人说的会存在不好的地方。
大家可以在留言中call我,我会积极探讨,相互进步。