在python中创建一个v7.3的.mat文件

Posted

技术标签:

【中文标题】在python中创建一个v7.3的.mat文件【英文标题】:Creating a .mat file of v7.3 in python 【发布时间】:2016-07-21 15:27:26 【问题描述】:

我需要在 python 或 matlab 中执行涉及 60000X70000 矩阵的乘法运算。我有一个 16GB 的 RAM,并且能够轻松加载矩阵的每一行(这是我所需要的)。我可以在 python 中创建整个矩阵,但不能在 matlab 中创建。 无论如何我可以使用 h5py 或 scipy 将数组保存为 v7.3 的 .mat 文件,以便我可以单独加载每一行?

【问题讨论】:

【参考方案1】:

对于 MATLAB v7.3,您可以使用需要 h5pyhdf5storage,在此处下载文件,解压缩,然后在命令提示符下键入:python setup.py install。 https://pypi.python.org/pypi/hdf5storage

import h5py
import hdf5storage
import numpy as np

matfiledata =  # make a dictionary to store the MAT data in
matfiledata[u'variable1'] = np.zeros(100) # *** u prefix for variable name = unicode format, no issues thru Python 3.5; advise keeping u prefix indicator format based on feedback despite docs ***
matfiledata[u'variable2'] = np.ones(300)
hdf5storage.write(matfiledata, '.', 'example.mat', matlab_compatible=True)

如果 MATLAB 无法一次加载整个内容,我认为您必须将其保存在不同的变量中 matfiledata[u'chunk1'] matfiledata[u'chunk2'] matfiledata[u'chunk3'] 等。

然后在 MATLAB 中,如果您将每个块保存为变量

load(filename,'chunk1')
do stuff...
clear chunk1
load(filename,'chunk2')
do stuff...
clear chunk2

等等

hdf5storage.savemat 有一个参数可以让文件在未来被正确读取到 Python 中,所以值得一试,并且遵循 scipy.io.loadmat 格式......虽然如果保存数据你可以这样做从 MATLAB 中轻松导入回 Python:

MATLAB    
save('example.mat','-v7.3')
Python
matdata = hdf5storage.loadmat('example.mat')

这将作为字典加载回 Python,然后您可以将其转换为您需要的任何数据类型。

【讨论】:

您是否忘记将字典名称的名称设置为 u'name' 这使其成为 unicode 键? 谢谢!但是在尝试执行hdf5storage.write 命令时出现内存错误,有解决方法吗? 是的,我忘记了我现在解决的字典键的正确语法。 请注意,这里的第一个示例显示您可以一次读取 v7.3 MAT 文件 1 列(只需将 (:,1) 与 (1,:) 反转以获取行:@987654322 @ 并避免将整个 MAT 文件加载到内存中。这样可以使您的内存使用率尽可能高,而不会出现内存不足错误。 使用 for 循环,其中 i=1 到 size(array,2) 列,到 size(array,1) 行,分别循环遍历每个。将更多向量组合在一起可能是一种更好的方法,但这是一次最小的行或列内存使用量。

以上是关于在python中创建一个v7.3的.mat文件的主要内容,如果未能解决你的问题,请参考以下文章

python读取mat(v7.3)文件中的cell以及struct

如何打开未使用 -v7.3 标志保存的大型 .mat 文件?

MATLAB中如何建立一个Mat文件

保存 .mat 文件,使用 -v7.3 开关?

自动在python中创建多个文件夹[重复]

在 Spark 中的 EMR 上使用 --py-files 从 .zip 文件(使用 zipfile 包在 python 中创建)导入模块时出现问题