将复杂数据从 .mat 文件导入为 numpy 数组

5 投票
1 回答
3297 浏览
提问于 2025-04-18 14:47

我有一个关于元组的问题。我在使用一个程序,它可以把大型的三维数组输出为.mat格式。这些在MATLAB中运行得很好。它们是较新的.mat格式(基于HDF5)。

假设我在MATLAB中生成了一个10x10x10的复数三维矩阵,并把它保存为trial.mat。

a = rand(10,10,10) + 1i*rand(10,10,10);
save('trial.mat')

现在我尝试在Python中加载变量a。以下是我所做的。

import numpy as np
import h5py
f = h5py.File('trial.mat','r')
a = np.array(f['a'])
print a
print np.shape(a)

这是我得到的输出的最后几行。

   (0.7551184371302334, 0.15987275885464014)
   (0.5261111725119932, 0.7314707154838205)
   (0.8501109979307012, 0.05369411719045292)
   (0.8160309248196381, 0.7143895270837854)]]]
(10L, 10L, 10L)

这些数据是一个包含元组的三维数组。我该如何将其转换为一个包含复数的三维numpy数组?我需要这个数组来进行进一步的分析。实际的数组相当大(1.5 GB及以上)。我的意思是像(0.81, 0.71)这样的元组应该能用作0.81 + 0.71j。

我使用的是MATLAB R2010a和Python 2.7.7,属于Anaconda 2.01(x86-64)发行版,运行在Windows 7上。

也许这和以下问题有关,但我不太确定。如何通过h5py读取v7.3的mat文件?

非常感谢你的帮助。

1 个回答

4

我在Windows Server 2008上使用的是matlab R2010b,发现保存成hdf5文件时需要加上 '-v7.3' 这个选项。如果不加这个选项,我得到的是“版本 0x0100”,加了之后则是“版本 0x0200”。

a = rand(10,10,10) + 1i*rand(10,10,10);
a(10,10,10) % in my case, result is 0.8667 + 0.3673i
save('trial.mat', '-v7.3')

在Python这边(我是在Linux下运行):使用 view 将元组转换成复数值,然后再用实数值重复一次,检查顺序是否正确:

import numpy as np
import h5py
f = h5py.File('trial.mat','r')
zz = f['a'].value.view(np.double).reshape((10,10,10,2))
zzj = zz[:,:,:,0] + 1j*zz[:,:,:,1]
zzk = f['a'].value.view(np.complex)
np.all(zzk == zzj)  # result is "True"
zzj.shape  # result is (10, 10, 10)
zzk[9,9,9].imag == f['a'][9,9,9][1]  # result is "True"
zzk[9,9,9]  # result is (0.8667498969993187+0.36728591513136899j) consistent with Matlab

我们看到:

  • zzjzzk 的复数值正确地分成了实部和虚部
  • zzjzzk 中对应的值与Matlab中的值一致

我还没有对比过处理大数组的时间,但我猜直接把hdf5对象转换成 complex 是最快的。

撰写回答