如何使用h5py BUT在python中导入.mat -v7.3文件,具有相同的维度顺序?

时间:2015-02-28 19:00:27

标签: python h5py

我有几个.mat文件,每个文件都包含一个Matrix。我需要使用h5py在python中导入它们,因为它们已被-v7.3保存 例如:

*myfile.mat  includes matrix X with the size of (10, 20)*

我在python中使用以下命令:

*import numpy np,h5py
f=h5py.File('myfile.mat','r')
data=np.array(f['X'])
data.shape*    ->    **(20, 10)  Here is the problem!**

矩阵X被转置。如何在不转置的情况下导入X?

1 个答案:

答案 0 :(得分:1)

我认为你必须接受转座。 MATLAB如果F命令,numpy C命令(默认情况下)。沿loadmat行的某处进行了移调。 h5py没有,所以你必须进行某种转置或重新排序。

顺便说一下,transposenumpy数组中最便宜的操作之一。

在Octave中保存(2,3)数组

octave:27> x=[0,1,2;3,4,5]
octave:28> save 'x34_7.mat' '-7' x
octave:33> save 'x34_h5.mat' '-hdf5' x
octave:32> reshape(x,[1,6])
ans =   0   3   1   4   2   5

加载它。形状是(2,3),但如果F有序:

In [102]: x7=loadmat('x34_7.mat')

In [103]: x7['x']
Out[103]: 
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.]])

In [104]: _.flags
Out[104]: 
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  ...

查看h5版本:

In [110]: f=h5py.File('x34_h5.mat','r')

In [111]: x5=f['x']['value'][:]
Out[111]: 
array([[ 0.,  3.],
       [ 1.,  4.],
       [ 2.,  5.]])
# C_contiguous

x5缓冲区中的数据与Octave中的数据顺序相同:

In [134]: np.frombuffer(x5.data, float)
Out[134]: array([ 0.,  3.,  1.,  4.,  2.,  5.])

来自loadmat的数据也是如此(虽然我必须通过frombuffer转换来查看它(是Ccontiguous)

In [139]: np.frombuffer(x7.T.data,float)
Out[139]: array([ 0.,  3.,  1.,  4.,  2.,  5.])

(是否有更好的方式来确定x5.datax7.data具有相同的内容?)

此图案具有更高的尺寸。在MATLAB中,第一个维度变化最快。由h5py加载,该维度对应于最后一个维度。因此,x(:,2,2,2)对应于x[1,1,1,:]x.T[:,1,1,1]