python减小内存占用_使用无损压缩减少NumPy的内存使用

在使用NumPy时,对于因数组过大而导致的内存问题,一个基本的减少内存占用的方法即压缩。通过改变数据的展示方式,通常在无需更改大量代码的情况下,即可达到减少内存占用的目的。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

本文将介绍如下内容:qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

通过更小的数据类型(dtype)减少内存占用qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

稀疏矩阵qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

上述解决方案不适用的场景qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

使用更小的数据类型qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

在NumPy中创建数组时,会为其指定一个数据类型。此类型可能是uint8(无符号8位整数)或float64(64位浮点数)等等。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

不同的数据类型所表示的数值范围有所不同:qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

16位uint的范围是0-65535qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

64位uint的范围是0-18446744073709551615qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

它们的内存使用程度也各不相同;64位整数需要的内存空间是16位整数的4倍。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

这就给予我们减少内存占用的机会:如果数据是一个0~60k的整数,那么使用32位或64位的整数是没有意义的,可以使用16位整数进行内存空间优化。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

如你所料,16位数组所占用的内存空间仅是64位数组的25%。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

稀疏矩阵qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

Dtype关注压缩数组中的单个单元,而稀疏矩阵则侧重于数组的整体结构。特别是,如果数组中大部分数据为0,那么为什么要花费空间来存储这些0呢?qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

稀疏矩阵只存储非0数据,其余数据都假定为0。根据数据的结构,有多种方式实现矩阵稀疏化,这里只关注其中的一种:coordinate-style。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

想象一幅黑白的星空图片:大部分的背景是黑色的(也就是0),偶尔会有星星出现。这里无需存储全部数据,而是按照“在Y=123,X=500处有一个亮度为128的像素”进行存储。而未提到的像素被假定亮度为0。为每个星星记录XY坐标会产生一些内存开销,但是只要大多数的背景是黑色的,这个数据结构仍然会比正常的全数组节省内存。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

举例:使用coordinate-style稀疏矩阵减少内存占用qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

在python中,sparse库提供了兼容NumPy数组的稀疏矩阵的实现。它主要基于coordinate-style矩阵,被称为COO格式。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

下面是一个基于Sparse文档的例子:创建一个二维数组,其均匀噪声在0~1之间,并将90%的像素设置为黑色。如果将其视为图片,则类似于上面给出的星空的例子,其中有很多的零,偶尔会出现亮点。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

然后比较原始形式和COO-sparse形式的内存占用情况:qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

稀疏矩阵占用的内存空间约为原始数组的30%;其中仅有10%为非零值,其他为存储X和Y坐标产生的额外开销。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

当这些策略行不通时qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

假设有一个用数组存储的图像,鉴于图像性质,可以采用16位无符号整数,以**大程度的限制内存的使用。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

然而,当使用scikit-image库函数时,一切就没那么简单了。即使数组采用的数据类型不是float64,在使用该库的相关函数时也会被立刻转换。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

在这种情况下,会存在16位的原始图像和被转换后的64位新图像,此时每个像素将占用80位的内存空间。因此,**好一开始就将图像存储为64位浮点数,毕竟相对而言会占用更少的内存空间。类似的问题也适用于稀疏矩阵。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

通过无损压缩节省内存qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

许多情况下,仅对代码进行少量修改就可以减少内存使用,甚至无需更改相应的数据。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

想要了解更多使用NumPy或其他数据计算库来处理大量数据的技术吗?在后续文章中,我将向您介绍如何使用NumPy、Pandas等工具实现压缩等基础技术。qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

qTH少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值