Scipy稀疏矩阵bsr_array的使用

目录
  • 基本原理
  • 初始化
  • 内置方法

基本原理

bsr,即Block Sparse Row,bsr_array即块稀疏行矩阵,顾名思义就是将稀疏矩阵分割成一个个非0的子块,然后对这些子块进行存储。通过输入维度,可以创建一个空的bsr数组,但bsr格式并不可见,需要通过toarray转为数组,才能一窥全貌。

from scipy.sparse import bsr_array
import numpy as np
import sys
bsr = bsr_array((100, 200), dtype=np.int8)
sys.getsizeof(bsr)      # 48
bsr_arr = bsr.toarray() # 转为数组
sys.getsizeof(bsr_arr)  # 20120

egtsizeof可查看数据占用的内存,其中bsr占用48byte,转为数组之后占据20k,这就是稀疏矩阵存在的价值。

当然,全零的数组就直接叫全零数组得了,直接存个行列数比bsr还省事儿,接下来构造一个矩阵

from numpy.random import randint, rand
tmp = np.zeros([200,200])
for i in range(30):
    x, y = randint(195, size=(2))
    tmp[x:x+5, y:y+5]=rand(5,5)

print(tmp.size)            # 40000
bsr = bsr_array(tmp, blocksize=(5,5))    
print(bsr.data.size)       # 2850
print(bsr.indptr.size)     # 41
print(bsr.indices.size)    # 114
print(tmp.size)

bsr.data是bsr中存放的矩阵块;bsr.indices为这些矩阵块对应的列号数组;bsr.indptr为索引的行分割数组;这些零零碎碎加在一起也只有3005个数,和40k的tmp相比,可以说压缩效率非常高了。

通过data, indptr和indices,可以将bsr复原为矩阵。首先,列号和数据是一一对应的;其次indptr对索引和数据按行分割。在本例中,indptr的值为0, 2, 6, 8…,则data[0:2]存放在第0行,对应的列号为indices[0:2];data[2:6]存放在第1行,对应的列号为indices[2:6],以此类推。

初始化

bsr_array共有5种初始化方案:

  • bsr_array(D) D是一个稀疏数组或2 × D 2\times D2×D数组
  • bsr_array(S) S是另一种稀疏数组
  • bsr_array((M, N),dtype) 创建一个shape为( M , N ) (M, N)(M,N)的空数组,dtype为数据类型
  • bsr_array((data, ij)) ij是坐标数组,可分解为i,j=ij,data是数据数组,设新矩阵为a,则a[i[k], j[k]] = data[k]
  • bsr_array((data, indices, indptr))

前四种方法均有参数blocksize,为块尺寸;后两种方法均有参数shape,为稀疏矩阵的维度。

从原理上来说,通过data, indices, indptr来创建的bsr数组,属于"原生"的bsr数组,其创建规则就是前文提到的复原规则。

内置方法

稀疏数组在计算上并不便捷,所以bsr_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稀疏矩阵bsr_array的使用的文章就介绍到这了,更多相关Scipy稀疏矩阵bsr_array内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python scipy 稀疏矩阵的使用说明

    稀疏矩阵格式 coo_matrix coo_matrix 是最简单的稀疏矩阵存储方式,采用三元组(row, col, data)(或称为ijv format)的形式来存储矩阵中非零元素的信息. 在实际使用中,一般coo_matrix用来创建矩阵,因为coo_matrix无法对矩阵的元素进行增删改操作:创建成功之后可以转化成其他格式的稀疏矩阵(如csr_matrix.csc_matrix)进行转置.矩阵乘法等操作. coo_matrix可以通过四种方式实例化,除了可以通过coo_matrix(D)

  • Python稀疏矩阵scipy.sparse包使用详解

    目录 1. 前言 2. 导入包 3. 稀疏矩阵总览 4. 稀疏矩阵详细介绍 4.1 coo_matrix 4.2 dok_matrix 4.3 lil_matrix 4.4 dia_matrix 4.5 csc_matrix & csr_matrix 4.6 bsr_matrix 5. 稀疏矩阵的存取 5.1 用save_npz保存单个稀疏矩阵 6. 总结 7. 参考 1. 前言 数组和矩阵是数值计算的基础元素.目前为止,我们都是使用NumPy的ndarray数据结构来表示数组,这是一种同构的容

  • Python 稀疏矩阵-sparse 存储和转换

    稀疏矩阵-sparsep from scipy import sparse 稀疏矩阵的储存形式 在科学与工程领域中求解线性模型时经常出现许多大型的矩阵,这些矩阵中大部分的元素都为0,被称为稀疏矩阵.用NumPy的ndarray数组保存这样的矩阵,将很浪费内存,由于矩阵的稀疏特性,可以通过只保存非零元素的相关信息,从而节约内存的使用.此外,针对这种特殊结构的矩阵编写运算函数,也可以提高矩阵的运算速度. scipy.sparse库中提供了多种表示稀疏矩阵的格式,每种格式都有不同的用处,其中dok_m

  • Python使用稀疏矩阵节省内存实例

    推荐系统中经常需要处理类似user_id, item_id, rating这样的数据,其实就是数学里面的稀疏矩阵,scipy中提供了sparse模块来解决这个问题,但scipy.sparse有很多问题不太合用: 1.不能很好的同时支持data[i, ...].data[..., j].data[i, j]快速切片: 2.由于数据保存在内存中,不能很好的支持海量数据处理. 要支持data[i, ...].data[..., j]的快速切片,需要i或者j的数据集中存储:同时,为了保存海量的数据,也需

  • python实现稀疏矩阵示例代码

    工程实践中,多数情况下,大矩阵一般都为稀疏矩阵,所以如何处理稀疏矩阵在实际中就非常重要.本文以Python里中的实现为例,首先来探讨一下稀疏矩阵是如何存储表示的. 1.sparse模块初探 python中scipy模块中,有一个模块叫sparse模块,就是专门为了解决稀疏矩阵而生.本文的大部分内容,其实就是基于sparse模块而来的. 第一步自然就是导入sparse模块 >>> from scipy import sparse 然后help一把,先来看个大概 >>> h

  • python安装scipy的方法步骤

    Scipy高级科学计算库:和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算.统计分析,所以可以说是基于Numpy之上了. Scipy库的安装 pip install scipy Scipy有很多子模块可以应对不同的应用,例如插值运算,优化算法等等.SciPy则是在NumPy的基础上构建的更为强大,应用领域也更为广泛的科学计算包.正是出于这个原因,SciPy需要依赖NumPy的支持进行安装和运行. SciPy是世界上著名的Python开源科学计算库,建立在Numpy之上.

  • Python稀疏矩阵及参数保存代码实现

    1. 稀疏矩阵的建立:coo_matrix() from scipy.sparse import coo_matrix # 建立稀疏矩阵 data = [1,2,3,4] row = [3,6,8,2] col = [0,7,4,9] c = coo_matrix((data,(row,col)),shape=(10,10)) #构建10*10的稀疏矩阵,其中不为0的值和位置在第一个参数 print(c) 2. 稀疏矩阵转化为密集矩阵:todense() d = c.todense() prin

  • python的scipy.stats模块中正态分布常用函数总结

    python的scipy.stats模块是连续型随机变量的公共方法,可以产生随机数,通常是以正态分布作为scipy.stats的基本使用方法.本文介绍正态分布的两种常用函数:1.累积概率密度函数stats.norm.cdf(α,均值,方差):2.概率密度函数stats.norm.pdf(α,均值,方差). 1.stats.norm.cdf(α,均值,方差):累积概率密度函数 使用格式 status.norm.cdf(Norm) # 相当于已知正态分布函数曲线和x值,求函数x点左侧积分 使用实例

  • python数学建模(SciPy+ Numpy+Pandas)

    目录 前言 SciPy 学习 SciPy基本操作 1-求解非线性方程(组) 2-积分 3-最小二乘解 4-最大模特征值及对应的特征向量 Numpy学习(续) 1 Numpy 数学函数 1-1三角函数 2-舍入函数 2-1 numpy.around() 2-2 numpy.floor() 2-3 numpy.ceil() 3 Numpy算术函数 Pandas学习(续) Pandas 数据排序 DataFrame的排序 Pandas字符串处理 前言 SciPy 是一个开源的 Python 算法库和数

  • numpy稀疏矩阵的实现

    目录 1. coo存储方式 2. dok_matrix 3. csr和csc存储方式 4. lil_matrix 5. dia_matrix 6. 稀疏矩阵经验 1. coo存储方式 采用三元组(row, col, data)(或称为ijv format)的形式来存储矩阵中非零元素的信息. coo_matrix的优点:有利于稀疏格式之间的快速转换(tobsr().tocsr().to_csc().to_dia().to_dok().to_lil():允许重复项(格式转换的时候自动相加):能与CS

随机推荐