我对元组有疑问。我使用一个以.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?
将非常感谢帮助。
答案 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
我们看到了:
zzj
和zzk
具有正确排序为real和imag的复杂值zzj
和zzk
的相应条目与Matlab中的值匹配我没有将时间与大数组进行比较,但我打赌将hdf5对象直接转换为complex
是最快的。