Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用h5py导入python中的.mat-v7.3文件,但维度顺序相同?_Python_H5py - Fatal编程技术网

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

如何使用h5py导入python中的.mat-v7.3文件,但维度顺序相同?,python,h5py,Python,H5py,我有几个.mat文件,每个文件都包含一个矩阵。我需要使用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)

我有几个.mat文件,每个文件都包含一个矩阵。我需要使用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而不被转置?

我想你必须接受转置。MATLAB如果按F排序,则按numpy C排序(默认情况下)。沿着线路的某个地方,
loadmat
进行这种转换<代码>h5py没有,因此您必须进行某种转置或重新排序

顺便说一下,
transpose
numpy
阵列上最便宜的操作之一

以八度音阶保存(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
缓冲区中的数据顺序与倍频程中的顺序相同:

In [134]: np.frombuffer(x5.data, float)
Out[134]: array([ 0.,  3.,  1.,  4.,  2.,  5.])
来自
loadmat
的数据也是如此(尽管我必须用
frombuffer
进行转置来查看它)(要注意)

(有没有更好的方法来改变
x5.data
x7.data
具有相同的内容?)


此模式适用于更高的维度。在MATLAB中,它是变化最快的第一个维度。通过h5py加载,该维度对应于最后一个维度。因此a
x(:,2,2,2)
将对应于a
x[1,1,1,:]
,以及a
x.T[:,1,1]

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