如何在MATLAB版本大于v7.3的情况下保存大型mat文件并在Python中读取?

3

我在MATLAB中有一个大矩阵,需要将其保存以便在Python中使用。但是,当我尝试保存时,MATLAB只能使用-v7.3格式进行保存,然而这个版本的文件无法通过以下方式在Python中读取:

import scipy.io as spio
Data = spio.loadmat('example_file.mat', squeeze_me=True)
A = Data[‘B’]

因此需要使用 h5py 读取该数据,如下:

import h5py 
Data = h5py.File(‘example_file.mat’. ‘r’)
A = Data[‘B’]

以使用 h5py 的方式,矩阵 A 可以通过扩展名 H5 来读取和显示,但不能像使用 import scipy.io as spio 时生成的文件 A 那样直接查看矩阵中的数字。
是否可能以类似于保存小矩阵的方式保存大矩阵并使用 import scipy.io as spio 在 Python 中读取该矩阵呢? 或者,是否可能在 MATLAB 中以 -v7.3 格式保存大矩阵,并在 Python 中使用相同的扩展名和 import scipy.io as spio 读取矩阵? 编辑 以下是以格式 7.3 保存矩阵时发生的情况的示例。
在 MATLAB 中,我们可以生成矩阵并将其保存在版本 -v7.3 中:
example = randn(16,200) + i*randn(16,200); 
save('example.mat', '-v7.3')

我把它保存在v7.3中,因为如果矩阵很大,除了在那个版本中,我无法保存它!!

然后,要在Python中读取该文件,我们必须使用h5py如下所示:

import h5py as h5 
data_try = hs.File('example.mat', 'r')
A = np.array(data_try ) 

首先,在Python中,矩阵A的大小不是(16,200),而是(200,16)
其次,当我将矩阵A用作神经网络的输入时,会出现错误"can't cast from structure to non-structure, except if the structure only has a single field python"。我认为这是因为Python中矩阵A的dtype类似于[('real','<f8'), ('imag','<f8')]所致!!
但是,如果在Matlab中保存矩阵,并使用import scipy.io as spio读取它,就可以获得dtype为复数的简单矩阵。

使用 h5py 有什么问题吗?由于MAT现在是HDF5,因此使用MATLAB特定库没有任何意义。 - Daniel
一个相关的问题:https://dev59.com/LXNA5IYBdhLWcg3wrPyq - Daniel
1
@Daniel 使用h5py的问题是我无法将文件读取为numpy数组。 - New_student
这真的很奇怪,更大的尺寸数据必须从某个地方出现。你能提供一个例子吗?如果只是将x=rand(16,200)保存到mat文件中,会发生这种情况吗? - Daniel
@Daniel,我在问题中举了一个例子,并尝试更详细地解释了问题。 - New_student
2个回答

1
将一个矩阵保存为二进制文件:
clear
SomeData = 1:100*300;
MyMatrix=reshape(SomeData,100,[]);
disp(class(MyMatrix)) % you must know the data type in python. maybe save this info in file name.

MyMatrixBytes=typecast(MyMatrix(:),'uint8');

fid=fopen('z:/MyMatrixBytes.bin','wb');
fwrite(fid,MyMatrixBytes);
fclose(fid);

而在Python中:

import numpy as np

# dtype: double->float64 , single->float32
MyMatrixBytes = np.fromfile("z:/MyMatrixBytes.bin",dtype='float64')

它显示了这个错误:使用typecast时出错。第一个输入参数必须是完整的、非复杂的数值。其次,我需要将它保存为mat文件,...bin文件可以在Python中作为数组使用吗? - New_student
你的数组很复杂吗?如果是这样,那么请分离实部和虚部并保存它们。这是一个简单的Matlab过程。在Python中,我可以给你一行代码将二进制文件转换为数组。 - Mendi Barel

1

您可以使用-v7.3在MATLAB中保存大矩阵,然后按照以下步骤读取它以在Python中处理:

import numpy as np
import h5py as h5 

data_try = h5.File('example.mat', 'r')
A = np.array(data_try) 
A = A.view(np.complex)  or 
A = A.view(np.complex128)

那将使您能够使用生成的输出A而没有错误。祝好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接