scipy稀疏数组coo_array的实现

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())

其输出结果为

scipy稀疏数组coo_array的实现_第1张图片

但需要注意一点,若行数组和列数组所对应的矩阵坐标发生了重复,那么重复位置处对应的值会累加,

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())

结果为

scipy稀疏数组coo_array的实现_第2张图片

初始化方案

  • 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

到此这篇关于scipy稀疏数组coo_array的实现的文章就介绍到这了,更多相关scipy稀疏数组coo_array内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(scipy稀疏数组coo_array的实现)