正确理解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我,我会积极探讨,相互进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值