多维数据存储和多维数据操作,是数据分析和机器学习的科研工作中最常遇见的问题。
常见的多维度数据有:真彩图、遥感影像图、医学影像图,最近比较火的深度图等等。
针对上述问题,最优的解决方案是保存为HDF5格式。对应的Python库为h5py。
HDF5官方地址:https://www.hdfgroup.org/solutions/hdf5/
h5py官方地址:https://www.h5py.org/
首先回答第二个问题,如何拼接多维数据。
import numpy as np
# 创建(3, 1, 2)维度的矩阵
shape1 = (3, 1, 2)
a = np.zeros(shape1, dtype=np.int)
print(a.shape) # (3, 1, 2)
# 创建(4, 1, 2)维度的矩阵
shape2 = (4, 1, 2)
b = np.ones(shape2, dtype=np.int)
print(b.shape) # (4, 1, 2)
# 在第一个维度上拼接a和c
axis = 0 # axis指的是你想在第几个维度上进行拼接,因为numpy是0-base,所以第一个维度其实是0
c = np.concatenate((a, b), axis=axis)
print(c.shape) # (7, 1, 2)
import h5py
with h5py.File("c.hdf5", 'w') as f: # 写入的时候是‘w’
f.create_dataset("a_data", data=a, compression="gzip", compression_opts=5)
f.create_dataset("b_data", data=b, compression="gzip", compression_opts=5)
f.create_dataset("c_data", data=c, compression="gzip", compression_opts=5)
# c_data:是HDF5文件中c数据储存的名字
# compression="gzip":是对数据进行压缩,压缩的方式一个gzip
# compression_opts=5:是压缩等级,压缩等级越高,压缩的越好,但是压缩消耗的CPU时间会增加
with h5py.File("c.hdf5", 'r') as f: # 读取的时候是‘r’
print(f.keys())
a_new = f.get("a_data")[:]
b_new = f.get("b_data")[:]
c_new = f.get("c_data")[:]
验证一下写入的数据和读取的数据是不是一样
print(a == a_new)
print(b == b_new)
print(c == c_new)
import os
import numpy as np
data_5000_5000 = np.arange(0, 5000*5000, dtype=np.int).reshape(5000, 5000)
print(data_5000_5000)
[[ 0 1 2 … 4997 4998 4999]
[ 5000 5001 5002 … 9997 9998 9999]
[ 10000 10001 10002 … 14997 14998 14999]
…
[24985000 24985001 24985002 … 24989997 24989998 24989999]
[24990000 24990001 24990002 … 24994997 24994998 24994999]
[24995000 24995001 24995002 … 24999997 24999998 24999999]]
np.savetxt("data.txt", data_5000_5000)
print(os.path.getsize("data.txt") / 1024 / 1024)
596.0512161254883 MB
with h5py.File("data.hdf5", 'w') as f:
f.create_dataset("data", data=data_5000_5000, compression="gzip", compression_opts=5)
33.43095302581787 MB
可以看到,使用TXT格式保存使用了596.05MB,使用HDF5格式保存使用了33.43MB。
596.05 / 33.43
17.829793598564162
节省了大概17倍的空间