在Python中读取.mat文件.但数据的形状发生了变化

sha*_* li 6 python file-io matlab numpy mat-file

 % save .mat file in the matlab    
train_set_x=1:50*1*51*61*23;   
train_set_x=reshape(train_set_x,[50,1,51,61,23]);   
save(['pythonTest.mat'],'train_set_x','-v7.3');
Run Code Online (Sandbox Code Playgroud)

在matlab中获得的数据大小为(50,1,51,61,23).

我使用此链接的指令在Python中加载.mat文件.

代码如下:

import numpy as np, h5py
f = h5py.File('pythonTest.mat', 'r')
train_set_x = f.get('train_set_x')
train_set_x = np.array(train_set_x)
Run Code Online (Sandbox Code Playgroud)

train_set_x.shape的输出是(23L, 61L, 51L, 1L, 50L).预计会是(50L, 1L, 51L, 61L, 23L).所以我改变了形状

train_set_x=np.transpose(train_set_x, (4,3,2,1,0))
Run Code Online (Sandbox Code Playgroud)

我很好奇Python和matlab之间数据形状的变化.我的代码中有错误吗?

Sha*_*hai 4

您的代码中没有任何错误。Matlab 和 python 处理多维数组的方式存在根本区别。
Matalb 和 python 都将多维数组的所有元素存储为内存中的单个连续块。区别在于元素的顺序:
Matlab(如 Fortran)以列优先的方式存储元素,即根据数组的维度存储元素(对于 2D):

 [1 3;
  2 4]
Run Code Online (Sandbox Code Playgroud)

相比之下,Python以行优先的方式存储元素,即从数组的最后一个维度开始:

[1 2;
 3 4];
Run Code Online (Sandbox Code Playgroud)

因此,Matlab 中内存中大小 为 的块[m,n,k]被 python 视为形状 [k,n,m]为 的数组。

有关详细信息,请参阅此 wiki 页面

顺便说一句train_set_x,您可以尝试将其顺序设置为“Fortran”顺序(如 Matlab 中的 col-major),而不是转置 :

 train_set_x = np.array(train_set_x, order='F')
Run Code Online (Sandbox Code Playgroud)