Читайте.mat файл в Python. Но форма данных изменилась

 % 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).

Я загружаю файл.mat в Python с указанием этой ссылки.

Код выглядит следующим образом:

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. Есть ли ошибки в моем коде?

1 ответ

Решение

У вас нет ошибок в коде. Существует фундаментальное различие между Matlab и python в том, как они обрабатывают многомерные массивы.
И Matalb, и Python хранят все элементы многомерного массива как один непрерывный блок в памяти. Разница в порядке элементов:
Matlab(как и fortran) хранит элементы в виде столбца, то есть сохраняет элементы в соответствии с размерами массива для 2D:

 [1 3;
  2 4]

В отличие от этого, Python хранит элементы в порядке первой строки, начиная с последнего измерения массива:

[1 2;
 3 4];

Таким образом, блок в памяти с размером [m,n,k] в Matlab рассматривается питоном как массив форм [k,n,m],

Для получения дополнительной информации см. Эту страницу вики.

Кстати, вместо того, чтобы транспонировать train_set_x, вы можете попробовать установить его порядок в "Fortran" (как в Matlab):

 train_set_x = np.array(train_set_x, order='F')
Другие вопросы по тегам