本博客主要用于记录python稀疏矩阵表示方法;
方法1:
用dict以二进制字符串形式存储,参考链接:
http://www.jb51.net/article/51609.htm
方法2:
使用scipy中的sparse进行存储,sparse库中提供多种表示稀疏矩阵的格式,
1.稀疏矩阵表示
1) dok_matrix,继承于dict,以(行,列)作为key,对应值为矩阵中位于(行,列)中的元素值,适合单个元素的添加,删除和存取操作,通常用来逐渐添加非零元素,然后转换成其它支持快速运算的格式。
输入:
from scipy import sparse a = sparse.dok_matrix((3,4)) a[0,1] = 2.0 a[1,3] = 3.0 print a.keys() print a.values()
输出:
[(0, 1), (1, 3)] [2.0, 3.0]
设置对角矩阵,
输入:
from scipy import sparse a = sparse.dok_matrix((4,4)) a.setdiag(2)#设置值到对角元素上 print a.keys() print a.values()
输出:
[(3, 3), (0, 0), (1, 1), (2, 2)] [2.0, 2.0, 2.0, 2.0]
2)lil_matrix,使用两个列表保存非零元素,data保存每行中的非零元素,rows保存非零元素所在的列,适合逐个添加元素,并且能够快速获取行相关的数据。
输入:
from scipy import sparse 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
输出:
array([[], [], [1.0], [3.0, 2.0], [], [], [], [], [], []], dtype=object) array([[], [], [3], [2, 4], [], [], [], [], [], []], dtype=object)
3)coo_matrix,采用三个数组row、col和data保存非零元素的信息,三个数组的长度相同,row保存元素的行,col保存元素的列,data保存元素的值,coo_matrix不支持元素的存取和增删,一旦创建后,除了将它转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算。
coo_matrix支持重复元素,即同一行列坐标可以出现多次,当转换成其它格式的矩阵时,将对同一行列坐标对应的多个值进行求和。
输入:
from scipy import sparse 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]]
2.稀疏矩阵存取
有时候需要将稀疏矩阵保存至本地,以后直接读取即可。
1)savetxt/loadtxt,保存为文本文件,会将所有的元素保存,本地文件较大。
2)mmwrite/mmread,保存为mtx文件,只保存非零元素,本地文件小。
其中mmread/mmwrite,是在scipy.io库中。
参考链接:
http://blog.csdn.net/pipisorry/article/details/41762945
http://hyry.dip.jp/tech/book/page/scipynew/scipy-810-sparse.html#sparse
http://blog.csdn.net/stereohomology/article/details/37657777
http://scipy.github.io/devdocs/generated/scipy.sparse.dok_matrix.html#scipy.sparse.dok_matrix
序列化
import pickle
pickle.dump:将数据保存至本地;
pickle.load:从本地加载数据,和原来的数据一样,不需要重新解析;
参考链接:
http://www.cnblogs.com/linyawen/archive/2012/03/22/2411381.html