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


Posted in Python onMay 27, 2017

稀疏矩阵-sparsep

from scipy import sparse

稀疏矩阵的储存形式

在科学与工程领域中求解线性模型时经常出现许多大型的矩阵,这些矩阵中大部分的元素都为0,被称为稀疏矩阵。用NumPy的ndarray数组保存这样的矩阵,将很浪费内存,由于矩阵的稀疏特性,可以通过只保存非零元素的相关信息,从而节约内存的使用。此外,针对这种特殊结构的矩阵编写运算函数,也可以提高矩阵的运算速度。

scipy.sparse库中提供了多种表示稀疏矩阵的格式,每种格式都有不同的用处,其中dok_matrix和lil_matrix适合逐渐添加元素。

dok_matrix从dict继承,它采用字典保存矩阵中不为0的元素:字典的键是一个保存元素(行,列)信息的元组,其对应的值为矩阵中位于(行,列)中的元素值。显然字典格式的稀疏矩阵很适合单个元素的添加、删除和存取操作。通常用来逐渐添加非零元素,然后转换成其它支持快速运算的格式。

a = sparse.dok_matrix((10, 5))
a[2:5, 3] = 1.0, 2.0, 3.0
print a.keys()
print a.values()
[(2, 3), (3, 3), (4, 3)]
[1.0, 2.0, 3.0]

lil_matrix使用两个列表保存非零元素。data保存每行中的非零元素,rows保存非零元素所在的列。这种格式也很适合逐个添加元素,并且能快速获取行相关的数据。

b = sparse.lil_matrix((10, 5))
b[2, 3] = 1.0
b[3, 4] = 2.0
b[3, 2] = 3.0
print b.data
print b.rows
[[] [] [1.0] [3.0, 2.0] [] [] [] [] [] []]
[[] [] [3] [2, 4] [] [] [] [] [] []]

coo_matrix采用三个数组row、col和data保存非零元素的信息。这三个数组的长度相同,row保存元素的行,col保存元素的列,data保存元素的值。coo_matrix不支持元素的存取和增删,一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算。

coo_matrix支持重复元素,即同一行列坐标可以出现多次,当转换为其它格式的矩阵时,将对同一行列坐标对应的多个值进行求和。在下面的例子中,(2, 3)对应两个值:1和10,将其转换为ndarray数组时这两个值加在一起,所以最终矩阵中(2, 3)坐标上的值为11。

许多稀疏矩阵的数据都是采用这种格式保存在文件中的,例如某个CSV文件中可能有这样三列:“用户ID,商品ID,评价值”。采用numpy.loadtxt或pandas.read_csv将数据读入之后,可以通过coo_matrix快速将其转换成稀疏矩阵:矩阵的每行对应一位用户,每列对应一件商品,而元素值为用户对商品的评价。

row = [2, 3, 3, 2]
col = [3, 4, 2, 3]
data = [1, 2, 3, 10]
c = sparse.coo_matrix((data, (row, col)), shape=(5, 6))
print c.col, c.row, c.data
print c.toarray()
[3 4 2 3] [2 3 3 2] [ 1 2 3 10]
[[ 0 0 0 0 0 0]
 [ 0 0 0 0 0 0]
 [ 0 0 0 11 0 0]
 [ 0 0 3 0 2 0]
 [ 0 0 0 0 0 0]]

个人操作中选择,coo_matrix 选在因为涉及稀疏矩阵运算,但是如果不用其他形式存储则复杂度太高(时间和空间)1000*1000的matrix大约话2h,也是要命了。无奈想到了Pajek软件中数据的输入格式三元组:Python 稀疏矩阵-sparse 存储和转换

所以想到将自己的数据处理成类似的三元组!

即“matrix矩阵”—>"tuple三元组"—>"sparseMatrix2tuple"—>"scipy.sparse"

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python类继承用法实例分析
May 27 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
Java及python正则表达式详解
Dec 27 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
详解Python的循环结构知识点
May 20 Python
python多环境切换及pyenv使用过程详解
Sep 27 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 Python
Django基础之Model操作步骤(介绍)
May 27 #Python
python之PyMongo使用总结
May 26 #Python
Python3安装Pymongo详细步骤
May 26 #Python
Python计时相关操作详解【time,datetime】
May 26 #Python
Python表示矩阵的方法分析
May 26 #Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 #Python
Python简单网络编程示例【客户端与服务端】
May 26 #Python
You might like
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
解决option标签selected="selected"属性失效的问题
2017/11/06 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
python自动识别文本编码格式代码
2019/12/26 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
护理专业应届毕业生推荐信
2013/11/15 职场文书
迟到检讨书900字
2014/01/14 职场文书
经理聘任证明
2015/03/02 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python