将.mat文件中的复杂数据作为numpy数组导入

时间:2014-07-25 17:07:17

标签: python matlab numpy tuples h5py

我对元组有疑问。我使用一个以.mat格式转储大输出3-D数组的程序。它们在MATLAB中运行良好。它们是较新的.mat格式(基于HDF5)。 假设我在MATLAB中生成一个10x10x10的复数3D矩阵,并将其另存为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)

数据是元组的3D数组。如何将其转换为复杂数字的3D numpy数组?我需要它进行进一步的分析。实际的阵列非常大(1.5 GB或更高)。我的意思是(0.81,0.71)应该可用作0.81 + 0.71j

我在Windows 7上使用MATLAB R2010a和Python 2.7.7(Anaconda 2.01(x86-64)发行版的一部分)。

也许这与以下问题有关,但我不太确定。 How to read a v7.3 mat file via h5py?

将非常感谢帮助。

1 个答案:

答案 0 :(得分:4)

我在Windows Server 2008上使用matlab R2010b,我似乎需要'-v7.3'保存到hdf5文件中。如果没有该选项,我会得到“版本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具有正确排序为real和imag的复杂值
  • zzjzzk的相应条目与Matlab中的值匹配

我没有将时间与大数组进行比较,但我打赌将hdf5对象直接转换为complex是最快的。