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

Jay*_*rya 5 python matlab tuples numpy 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')
Run Code Online (Sandbox Code Playgroud)

现在我尝试在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)
Run Code Online (Sandbox Code Playgroud)

以下是我得到的输出的最后几行.

   (0.7551184371302334, 0.15987275885464014)
   (0.5261111725119932, 0.7314707154838205)
   (0.8501109979307012, 0.05369411719045292)
   (0.8160309248196381, 0.7143895270837854)]]]
(10L, 10L, 10L)
Run Code Online (Sandbox Code Playgroud)

数据是元组的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)发行版的一部分.

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

将非常感谢帮助.

Fra*_*k M 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')
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

我们看到:

  • zzj并将zzk复数值正确排序为实数和图像
  • 对应的条目zzjzzk与 Matlab 中的值相匹配

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