读取 Python 中的 .mat 文件。但是数据的形状发生了变化
Read .mat file in Python. But the shape of the data changed
% 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');
matlab中得到的数据大小为(50,1,51,61,23)。
我用这个link.
的指令加载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)
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))
我很好奇Python和matlab之间数据形状的变化。我的代码有什么错误吗?
您的代码没有任何错误。 Matlab 和 python 在处理多维数组的方式上存在根本区别。
Matalb 和 python 都将 multi-dim 数组的所有元素存储为内存中的单个连续块。区别在于元素的顺序:
Matlab,(类似于fortran)以列优先的方式存储元素,即根据数组的维度存储元素,对于二维:
[1 3;
2 4]
相比之下,Python以行优先的方式存储元素,即从last开始数组的维度:
[1 2;
3 4];
所以内存中的块 size [m,n,k]
在 Matlab 中被 python 视为 shape[=36 的数组=] [k,n,m]
.
有关详细信息,请参阅 this wiki page。
顺便说一句,而不是转置 train_set_x
,您可以尝试将其顺序设置为 "Fortran" 顺序(在 Matlab 中为 col-major):
train_set_x = np.array(train_set_x, order='F')
% 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');
matlab中得到的数据大小为(50,1,51,61,23)。
我用这个link.
的指令加载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)
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))
我很好奇Python和matlab之间数据形状的变化。我的代码有什么错误吗?
您的代码没有任何错误。 Matlab 和 python 在处理多维数组的方式上存在根本区别。
Matalb 和 python 都将 multi-dim 数组的所有元素存储为内存中的单个连续块。区别在于元素的顺序:
Matlab,(类似于fortran)以列优先的方式存储元素,即根据数组的维度存储元素,对于二维:
[1 3;
2 4]
相比之下,Python以行优先的方式存储元素,即从last开始数组的维度:
[1 2;
3 4];
所以内存中的块 size [m,n,k]
在 Matlab 中被 python 视为 shape[=36 的数组=] [k,n,m]
.
有关详细信息,请参阅 this wiki page。
顺便说一句,而不是转置 train_set_x
,您可以尝试将其顺序设置为 "Fortran" 顺序(在 Matlab 中为 col-major):
train_set_x = np.array(train_set_x, order='F')