单机环境下,如果特征较为稀疏且矩阵较大,那么就会出现内存问题,如果不上分布式 + 不用Mars/Dask/CuPy等工具,那么稀疏矩阵就是一条比较容易实现的路。


文章目录

  • 1 scipy.sparse
    • 1.1 SciPy 几种稀疏矩阵类型
    • 1.2 lil_matrix
    • 1.3 矩阵的通用属性
    • 1.4 稀疏矩阵存取
  • 2 pandas.sparse
    • 2.1 SparseArray
    • 2.2 新建SparseDataFrame
    • 2.3 格式转化
    • 2.4 稀疏矩阵的属性
    • 2.5 scipy.sparse与pandas.sparse
  • 3 sklearn

1 scipy.sparse

参考:
SciPy 稀疏矩阵笔记
Sparse稀疏矩阵主要存储格式总结
Python数据分析----scipy稀疏矩阵

1.1 SciPy 几种稀疏矩阵类型

SciPy 中有 7 种存储稀疏矩阵的数据结构:

  • bsr_matrix: Block Sparse Row matrix
  • coo_matrix: COOrdinate format matrix
  • csc_matrix: Compressed Sparse Column matrix
  • csr_matrix: Compressed Sparse Row matrix
  • dia_matrix: Sparse matrix with DIAgonal storage
  • dok_matrix: Dictionary Of Keys based sparse matrix
  • lil_matrix: Row-based LInked List sparse matrix

各个类型的用途:

  • 如果想创建一个新的稀疏矩阵,lil_matrix,dok_matrix和coo_matrix会比高效,但是它们不适合做矩阵运算。
  • 如果想做矩阵运算,例如矩阵乘法、求逆等,应该用 CSC 或者 CSR 类型的稀疏矩阵。
  • 由于在内存中存储顺序的差异,csc_matrix 矩阵更适合取列切片,
  • 而 csr_matrix 矩阵更适合用来取行切片。

1.2 lil_matrix

这里只说lil_matrix,因为笔者用的这款,且比较方便。
lil_matrix 是第二直观的稀疏矩阵存储方式。它的全称是 row-based linked list sparse matrix 。它包含两个要素:rows 和 data

示例代码一:

>>> from scipy.sparse import lil_matrix
>>> l = lil_matrix((6,5))
>>> l[2,3] = 1
>>> l[3,4] = 2
>>> l[3,2] = 3
>>> print l.toarray()
[[ 0.  0.  0.  0.  0.][ 0.  0.  0.  0.  0.][ 0.  0.  0.  1.  0.][ 0.  0.  3.  0.  2.][ 0.  0.  0.  0.  0.][ 0.  0.  0.  0.  0.]]
>>> print l.data
[[] [] [1.0] [3.0, 2.0] [] []]
>>> print l.rows
[[] [] [3] [2, 4] [] []]

示例代码二:

# 原始矩阵为array([[1., 0., 0., 0., 0.],[0., 0., 2., 0., 3.],[0., 0., 0., 0., 0.],[0., 0., 0., 4., 0.],[0., 0., 0., 0., 5.]])mat_lil = sparse.lil_matrix(mat_coo) # 几种稀疏矩阵之间可以相互转化# mat_lil 的两要素mat_lil.rowsarray([list([0]), list([2, 4]), list([]), list([3]), list([4])],dtype=object)mat_lil.dataarray([list([1.0]), list([2.0, 3.0]), list([]), list([4.0]), list([5.0])],dtype=object)

示例代码三:

# 创建矩阵
lil = sparse.lil_matrix((6, 5), dtype=int)# 设置数值
# set individual point
lil[(0, -1)] = -1
# set two points
lil[3, (0, 4)] = [-2] * 2
# set main diagonal
lil.setdiag(8, k=0)# set entire column
lil[:, 2] = np.arange(lil.shape[0]).reshape(-1, 1) + 1# 转为array
lil.toarray()
'''
array([[ 8,  0,  1,  0, -1],[ 0,  8,  2,  0,  0],[ 0,  0,  3,  0,  0],[-2,  0,  4,  8, -2],[ 0,  0,  5,  0,  8],[ 0,  0,  6,  0,  0]])
'''# 查看数据
lil.data
'''
array([list([0, 2, 4]), list([1, 2]), list([2]), list([0, 2, 3, 4]),list([2, 4]), list([2])], dtype=object)
'''
lil.rows
'''
array([[list([8, 1, -1])],[list([8, 2])],[list([3])],[list([-2, 4, 8, -2])],[list([5, 8])],[list([6])]], dtype=object)
'''

1.3 矩阵的通用属性

矩阵属性

from scipy.sparse import csr_matrix### 共有属性
mat.shape  # 矩阵形状
mat.dtype  # 数据类型
mat.ndim  # 矩阵维度
mat.nnz   # 非零个数
mat.data  # 非零值, 一维数组### COO 特有的
coo.row  # 矩阵行索引
coo.col  # 矩阵列索引### CSR\CSC\BSR 特有的
bsr.indices    # 索引数组
bsr.indptr     # 指针数组
bsr.has_sorted_indices  # 索引是否排序
bsr.blocksize  # BSR矩阵块大小

通用方法

import scipy.sparse as sp### 转换矩阵格式
tobsr()、tocsr()、to_csc()、to_dia()、to_dok()、to_lil()
mat.toarray()  # 转为array
mat.todense()  # 转为dense
# 返回给定格式的稀疏矩阵
mat.asformat(format)
# 返回给定元素格式的稀疏矩阵
mat.astype(t)  ### 检查矩阵格式
issparse、isspmatrix_lil、isspmatrix_csc、isspmatrix_csr
sp.issparse(mat)### 获取矩阵数据
mat.getcol(j)  # 返回矩阵列j的一个拷贝,作为一个(mx 1) 稀疏矩阵 (列向量)
mat.getrow(i)  # 返回矩阵行i的一个拷贝,作为一个(1 x n)  稀疏矩阵 (行向量)
mat.nonzero()  # 非0元索引
mat.diagonal()   # 返回矩阵主对角元素
mat.max([axis])  # 给定轴的矩阵最大元素### 矩阵运算
mat += mat     # 加
mat = mat * 5  # 乘
mat.dot(other)  # 坐标点积resize(self, *shape)
transpose(self[, axes, copy])

1.4 稀疏矩阵存取

存储 - save_npz

scipy.sparse.save_npz('sparse_matrix.npz', sparse_matrix)
sparse_matrix = scipy.sparse.load_npz('sparse_matrix.npz')

读取 - load_npz

# 从npz文件中读取
test_x = sparse.load_npz('./data/npz/test_x.npz')

存储大小比较

a = np.arange(100000).reshape(1000,100)
a[10: 300] = 0
b = sparse.csr_matrix(a)# 稀疏矩阵压缩存储到npz文件
sparse.save_npz('b_compressed.npz', b, True)  # 文件大小:100KB# 稀疏矩阵不压缩存储到npz文件
sparse.save_npz('b_uncompressed.npz', b, False)  # 文件大小:560KB# 存储到普通的npy文件
np.save('a.npy', a)  # 文件大小:391KB# 存储到压缩的npz文件
np.savez_compressed('a_compressed.npz', a=a)  # 文件大小:97KB• 1

2 pandas.sparse

Sparse data structures

2.1 SparseArray

In [1]: arr = np.random.randn(10)In [2]: arr[2:-2] = np.nanIn [3]: ts = pd.Series(pd.arrays.SparseArray(arr))In [4]: ts
Out[4]:
0    0.469112
1   -0.282863
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8   -0.861849
9   -2.104569
dtype: Sparse[float64, nan]

pandas中sparse变成一种格式,如dtype: Sparse[float64, nan]

2.2 新建SparseDataFrame

之前Pandas版本有:pd.SparseDataFrame(),不过这个在新版本被移除了。

SparseSeries and SparseDataFrame were removed in pandas 1.0.0. This migration guide is present to aid in migrating from previous versions.

一种方式:

# Previous way
>>> pd.SparseDataFrame({"A": [0, 1]})# New way
In [31]: pd.DataFrame({"A": pd.arrays.SparseArray([0, 1])})
Out[31]: A
0  0
1  1

The SparseDataFrame.default_kind and SparseDataFrame.default_fill_value attributes have no replacement.

另一种方式:

# Previous way
>>> from scipy import sparse
>>> mat = sparse.eye(3)
>>> df = pd.SparseDataFrame(mat, columns=['A', 'B', 'C'])# New way
In [32]: from scipy import sparseIn [33]: mat = sparse.eye(3)In [34]: df = pd.DataFrame.sparse.from_spmatrix(mat, columns=['A', 'B', 'C'])In [35]: df.dtypes
Out[35]:
A    Sparse[float64, 0]
B    Sparse[float64, 0]
C    Sparse[float64, 0]
dtype: object

第三种新建:

In [38]: dense = pd.DataFrame({"A": [1, 0, 0, 1]})In [39]: dtype = pd.SparseDtype(int, fill_value=0)In [40]: dense.astype(dtype)
Out[40]: A
0  1
1  0
2  0
3  1

2.3 格式转化

# SparseDataFrame -> dataframe
In [36]: df.sparse.to_dense()
Out[36]: A    B    C
0  1.0  0.0  0.0
1  0.0  1.0  0.0
2  0.0  0.0  1.0# SparseDataFrame -> spacy.coo
In [37]: df.sparse.to_coo()
Out[37]:
<3x3 sparse matrix of type '<class 'numpy.float64'>'with 3 stored elements in COOrdinate format>

2.4 稀疏矩阵的属性

Sparse-specific properties, like density, are available on the .sparse accessor.

In [41]: df.sparse.density
Out[41]: 0.3333333333333333

2.5 scipy.sparse与pandas.sparse

从scipy -> pandas
pd.DataFrame.sparse.from_spmatrix 可以使用

In [47]: from scipy.sparse import csr_matrixIn [48]: arr = np.random.random(size=(1000, 5))In [49]: arr[arr < .9] = 0In [50]: sp_arr = csr_matrix(arr)In [51]: sp_arr
Out[51]:
<1000x5 sparse matrix of type '<class 'numpy.float64'>'with 517 stored elements in Compressed Sparse Row format>In [52]: sdf = pd.DataFrame.sparse.from_spmatrix(sp_arr)In [53]: sdf.head()
Out[53]: 0    1    2         3    4
0  0.956380  0.0  0.0  0.000000  0.0
1  0.000000  0.0  0.0  0.000000  0.0
2  0.000000  0.0  0.0  0.000000  0.0
3  0.000000  0.0  0.0  0.000000  0.0
4  0.999552  0.0  0.0  0.956153  0.0In [54]: sdf.dtypes
Out[54]:
0    Sparse[float64, 0]
1    Sparse[float64, 0]
2    Sparse[float64, 0]
3    Sparse[float64, 0]
4    Sparse[float64, 0]
dtype: object

从pandas -> scipy

In [61]: A, rows, columns = ss.sparse.to_coo(row_levels=['A', 'B'],....:                                     column_levels=['C', 'D'],....:                                     sort_labels=True)....: In [62]: A
Out[62]:
<3x4 sparse matrix of type '<class 'numpy.float64'>'with 3 stored elements in COOrdinate format>In [63]: A.todense()
Out[63]:
matrix([[0., 0., 1., 3.],[3., 0., 0., 0.],[0., 0., 0., 0.]])In [64]: rows
Out[64]: [(1, 1), (1, 2), (2, 1)]In [65]: columns
Out[65]: [('a', 0), ('a', 1), ('b', 0), ('b', 1)]

3 sklearn

一般情况scipy.sparse可以直接使用,进行train_test_split
如果pandas.sparse不行,那么就转成pandas x = x.sparse.to_dense()应该也是可以的:

fea_datasets = csr_matrix((data, (row, col)), shape=(row_index, max_col+1)).toarray()
#当特征维度过大时,选下面这种方式(加toarray()和不加都是对的),内存不容易爆掉
#fea_datasets = csr_matrix((data, (row, col)), shape=(row_index, max_col+1))x_train, x_test, y_train, y_test = train_test_split(fea_datasets, target_list, test_size = 0.2, random_state = 0)
return x_train, x_test, y_train, y_test

笔者看到一般scipy中csr_matrix格式一般支持sklearn的模型训练;
如果是pandas.sparse可能会报错,所以,需要变成dataframe

scipy.sparse、pandas.sparse、sklearn稀疏矩阵的使用相关推荐

  1. 关于在Ubuntu下安装配置numpy,scipy,matplotlibm,pandas 以及sklearn

    最近在用Python学习机器学习,正好需要配置相关组件.也在网上查了一些,汇总了一下.顺便分享给大家,若有不对之处,请指出,谢谢. 关于Windows环境下配置及相应安装包 链接  推荐可以去看一看. ...

  2. 基于pandas python sklearn 的美团某商家的评论分类(文本分类)

    基于pandas python sklearn 的美团某商家的评论分类(文本分类) 美团店铺评价语言处理以及分类(NLP) 第一篇 数据分析部分 第二篇 可视化部分, 本文是该系列第三篇,文本分类 主 ...

  3. python基础知识及数据分析工具安装及简单使用(Numpy/Scipy/Matplotlib/Pandas/StatsModels/Scikit-Learn/Keras/Gensim))

    Python介绍. Unix & Linux & Window & Mac 平台安装更新 Python3 及VSCode下Python环境配置配置 python基础知识及数据分 ...

  4. Python科学库sklearn.numpy.scipy. matplotlib.pandas

    1.解释 (1).sklearn 是一个 Python 的 科学计算库,提供了数种聚类算法可供选择 (2).numpy.scipy 是 Python 的科学运算库 (3).matplotlib 是图形 ...

  5. matlab sparse用法,sparse 稀疏函数的用法2

    sparse函数 功能:Create sparse matrix-创建稀疏矩阵 用法1:S=sparse(X)--将矩阵X转化为稀疏矩阵的形式,即矩阵X中任何零元素去除,非零元素及其下标(索引)组成矩 ...

  6. scipy.spatial.distance 与 sklearn cosine_similarity

    1.scipy.spatial.distance from scipy.spatial.distance import pdist,squareform a=[1,1,1] b=[1,1,2] c=[ ...

  7. 简述Python的Numpy,SciPy和Pandas,Matplotlib的区别

    Numpy: 基础的数学计算模块,以矩阵为主,纯数学. SciPy: 基于Numpy,提供方法(函数库)直接计算结果,封装了一些高阶抽象和物理模型.比方说做个傅立叶变换,这是纯数学的,用Numpy:做 ...

  8. 【Python】常用包整理,包括Numpy、Pandas、sklearn、url、pymysql、Wxpy、Xlwt、Pyecharts等

      对数据分析.机器学习.数据科学.金融风控等感兴趣的小伙伴,需要数据集.代码.行业报告等各类学习资料,可关注微信公众号:风控圏子(别打错字,是圏子,不是圈子,算了直接复制吧!)   关注公众号后,可 ...

  9. python关联分析sklearn_Python3利用pandas,sklearn进行关联度分析以及预测的demo

    做个简单的demo记录下,防止忘记 先看原始数据: 一共有5列:日期,金钱,性别,工作年限,年龄. 我们的目的是要分析各个维度对金钱的影响. 关联度分析代码: # -*- coding: utf-8 ...

最新文章

  1. 如果redis哨兵宕机了怎么办_Spring集成Redis做缓存,Redis宕机时Spring处理的问题
  2. 今晚直播 | 平安人寿资深算法工程师姚晓远:对话生成模型的探析与创新
  3. 【Android开发—智能家居系列】(一):智能家居原理
  4. 办公室自动化系统_RPA:办公自动化的下一站
  5. [http]HTTP状态码含义
  6. 揭开netty神秘面纱_Netty 源码(ChannelHandler 死磕)
  7. 央视美女记者王冰冰身上,我看到了一个职场人特别需要的能力
  8. nginx 配置图片服务器 文件大小,nginx 配置图片服务器 文件大小
  9. 飞行堡垒FX80GM热键无反应与触摸板无法使用
  10. python程序设计与应用_Python程序设计及应用
  11. 无线网检查服务器在那,无线网络服务器地址在哪里找
  12. Oracle与MySQL的SQL语句区别
  13. 许怡然:网游创业失败全攻略
  14. 2019寒假·纪中记Day0-Day3
  15. 链路追踪Logback-ERROR日志邮件发送
  16. 推荐几个不错第 Java 学习网站
  17. 如何开发手游联运平台?
  18. CentOS7 好日子到头了,如何优雅的抛弃 CentOS7?
  19. 【待研究】THP对fork速度的影响
  20. 华为实验18-OSPF区域认证

热门文章

  1. tomcat ---- 启动,关闭和配置等等
  2. 【软件project】之第五、六章总结
  3. [osx] android studio下修改avd的hosts文件
  4. extentreports报告插件与testng集成(二)
  5. 小姐姐把信息撤了后如何查看?Python百行代码分秒恢复!
  6. 都别争了!分布式锁也是锁
  7. json parse
  8. composer:php的依赖管理工具
  9. Nagios学习实践系列——配置研究[监控当前服务器]
  10. KVM下桥接的设置(Ubuntu)