压缩二进制numpy数据

jqy 提供的 flickr 数据里[4],label 只有 51K,而自己做的数据[5] label 有 3.7M(当时不懂事,存了 float64)。但后来做 nuswide[6] 时即使以 int8 存,还是比 jqy 提供的数据大。应该是用了位压缩。

packbits, unpackbits

对二进制数据(只有 0/1),如 label、BoW 形式的 text,numpy 可以用 packbits 压缩,这样存就是 59K = 3.7 * 1024 / 64,接近了。这样有点麻烦的地方在于:以后读出来,要用 unpackbits 还原先,但 jqy 给的 .mat 数据不用的,直接读出来就行。

savemat

scipy.io.savemat 有个参数是 do_compression,设为 True 之后存成 .mat,就是 51K。推荐。

Code

import os                                                                                    
import numpy as np
import scipy.io as sio

# 换成 uint8 先
L = np.load("labels.npy").astype(np.uint8)

# 1. 用 (un)packbits
L_c = np.packbits(L, axis=1)  # 压缩
print(L_c.dtype)
np.save("labels.pack.npy", L_c)
L_r = np.unpackbits(L_c, axis=1)  # 复原
print("diff:", np.not_equal(L, L_r).sum())

# 2. savemat 时 do_compression
sio.savemat("labels.compress.mat", {"labels": L}, do_compression=True)

References

  1. numpy.packbits
  2. numpy.unpackbits
  3. scipy.io.savemat
  4. jiangqy/DCMH-CVPR2017
  5. MIR-Flickr25K数据集预处理
  6. NUS-WIDE数据集预处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值