好吧,问题在于 pickle 而不是 Python 本身。正如其他人所提到的,以 7.3 或更高版本保存的 .mat 文件使用 HDF5 格式。HDF5 已针对高效存储和检索大型数据集进行了优化;Pickle 以不同的方式处理数据。您可以使用 h5py 或 netcf4 Python 模块复制甚至超越 Matlab 的保存功能;NetCDF 是 HDF5 的子集。例如,使用 HDF5,您可以执行以下操作:
import h5py
import numpy as np
f = h5py.File('test.hdf5','w')
a = np.arange(10)
dset = f.create_dataset("init", data=a)
f.close()
我不确定在 MATLAB 中执行等效操作是否会产生完全相同大小的文件,但应该很接近。您可以使用 HDF5 的压缩功能来获得您想要的结果。
编辑1:
要加载 HDF5 文件,例如.mat
文件,您可以执行类似M2 = h5py.File('file.mat')
. M2 是一个 HDF5 组,有点像 python 字典。做M2.keys()
给你变量名。如果其中一个变量是一个名为“data”的数组,您可以通过data = M2["data"][:]
.
编辑2:
要保存多个变量,您可以创建多个数据集。基本语法是f.create_dataset("variable_name", data=variable)
. 有关更多选项,请参见链接。例如
import h5py
import numpy as np
f = h5py.File('test.hdf5','w')
data1 = np.ones((4,4))
data2 = 2*data1
f.create_dataset("ones", data=data1)
f.create_dataset("twos", data=data2)
f
既是文件对象又是 HDF5 组。这样做f.keys()
会给出:
[u'ones', u'twos']
要查看“ones”键下存储的内容,您可以:
f['ones'][:]
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
您可以根据需要创建任意数量的数据集。完成文件写入后,关闭文件对象:f.close()
.
我应该补充一点,我的方法仅适用于类似数组的数据集。您可以保存其他 Python 对象,例如列表和字典,但这样做需要更多的工作。我只对大型 numpy 数组使用 HDF5。对于其他一切,泡菜对我来说效果很好。