coo_array
coo也被称为ijv,是一种三元组格式,对于矩阵中第i ii行第j jj列的值v vv,将其存储为( i , j , v ) (i,j,v)(i,j,v)这样的三元组,即为coo_array的原理。
例如
import numpy as np from scipy.sparse import coo_array row = np.array([0, 3, 1, 0]) col = np.array([0, 3, 1, 2]) data = np.array([4, 5, 7, 9]) coo_array((data, (row, col)), shape=(4, 4)).toarray() print(coo.toarray())
其输出结果为
但需要注意一点,若行数组和列数组所对应的矩阵坐标发生了重复,那么重复位置处对应的值会累加,
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_array((data, (row, col)), shape=(4, 4)) print(coo.toarray())
结果为
初始化方案
- coo_array(D) D是一个稀疏数组或2 × D 2\times D2×D数组
- coo_array(S) S是另一种稀疏数组
- coo_array((M, N),dtype='d') 创建一个shape为( M , N ) (M, N)(M,N)的空数组,dtype为数据类型
- coo_array((data, (i,j))) (i, j)是坐标数组,data是数据数组,设新矩阵为a,则a[i[k], j[k]] = data[k]
前三种比较容易理解,下面验证一下第四种
>>> from scipy.sparse import coo_array
>>> import numpy as np
>>> data = np.random.rand(3)
>>> x = y = np.arange(3).astype(int)
>>> coo = coo_array((data,(x,y)))
>>> coo.toarray()
array([[0.28050236, 0. , 0. ],
[0. , 0.59568482, 0. ],
[0. , 0. , 0.84392724]])
内置方法
稀疏数组在计算上并不便捷,所以coo_array中内置了下列函数,可以高效地完成计算。
| 函数 |
expm1, log1p, sqrt, pow, sign
|
| 三角函数 |
sin, tan, arcsin, arctan, deg2rad, rad2deg
|
| 双曲函数 |
sinh, tanh, arcsinh, arctanh
|
| 索引 |
getcol, getrow, nonzero, argmax, argmin, max, min
|
| 舍入 |
ceil, floor, trunc
|
| 变换 |
conj, conjugate, getH
|
| 统计 |
count_nonzero, getnnz, mean, sum
|
| 矩阵 |
diagonal, trace
|
| 获取属性 |
get_shape, getformat
|
| 计算比较 |
multiply, dot, maximum, minimum
|
| 转换 |
asformat, asfptype, astype, toarray, todense
|
| 转换 |
tobsr, tocoo, tocsc, tocsr, todia, todok, tolil
|
| 更改维度 |
set_shape, reshape, resize, transpose
|
| 排序 |
sort_indices, sorted_indices
|
| 移除元素 |
eliminate_zeros, prune, sum_duplicates
|
| 其他 |
copy, check_format, getmaxprint, rint, setdiag
|
原文地址:https://tinycool.blog.csdn.net/article/details/128866351