2016-09-01 20 views
6
% 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'); 

Dữ liệu thu được trong matlab có kích thước là (50,1,51,61,23).Đọc tệp .mat bằng Python. Nhưng hình dạng của dữ liệu đã thay đổi

Tôi tải tệp .mat bằng Python với hướng dẫn của số link này.

Mã này là như sau:

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) 

Kết quả của train_set_x.shape là (23L, 61L, 51L, 1L, 50L). Dự kiến ​​là (50L, 1L, 51L, 61L, 23L). Vì vậy, tôi đã thay đổi hình dạng bằng cách

train_set_x=np.transpose(train_set_x, (4,3,2,1,0)) 

Tôi tò mò về sự thay đổi về hình dạng dữ liệu giữa Python và MATLAB. Có một số lỗi trong mã của tôi không?

+1

liên quan: http://stackoverflow.com/q/24116713/1714410 – Shai

+0

Đối với các phiên bản '.mat' trước đó,' scipy.io.loadmat' tạo ra các mảng có cùng hình dạng như MATLAB, nhưng 'order = 'F''. Vì vậy, nó loại ẩn sự khác biệt này. – hpaulj

+0

@hpaulj: Ý bạn là gì từ sớm? Thay đổi hành vi cho các phiên bản "trễ" là gì? – Eric

Trả lời

4

Bạn không có bất kỳ lỗi nào trong mã. Có một sự khác biệt cơ bản giữa Matlab và python theo cách chúng xử lý các mảng đa chiều.
Cả Matalb và python đều lưu trữ tất cả các phần tử của mảng đa mờ làm khối liên tiếp duy nhất trong bộ nhớ. Sự khác biệt là thứ tự của các yếu tố:
Matlab, (như Fortran) lưu trữ các yếu tố trong một thời trang cột đầu tiên, đó là lưu trữ các yếu tố theo kích thước của mảng, cho 2D:

[1 3; 
    2 4] 

Ngược lại, Python, lưu trữ các yếu tố trong một thời trang hàng đầu tiên, đó là bắt đầu từ chiều cuối của mảng:

[1 2; 
3 4]; 

Vì vậy, một khối trong bộ nhớ với kích thước[m,n,k] trong Matlab được python nhìn thấy dưới dạng mảng hình dạng[k,n,m].

Để biết thêm thông tin, hãy xem this wiki page.

BTW, thay vì transposing train_set_x, bạn có thể thử thiết lập trật tự của mình để "Fortran" trật tự (col-lớn như trong Matlab):

train_set_x = np.array(train_set_x, order='F') 
+0

Kết quả khác với chuyển đổi khi bạn đặt 'order = 'F''? Hay nó chỉ tạo sự khác biệt trong việc sử dụng bộ nhớ? – Ian

+0

trong chuyển dịch 'numpy' là một hoạt động O (1): nó không định vị lại các phần tử trong bộ nhớ, chỉ treo dữ liệu meta của mảng ([strides'] của nó (http://docs.scipy.org/ doc/numpy/reference/generated/numpy.ndarray.strides.html)). Tôi cho rằng bạn có thể so sánh 'strides' và' shape' giữa việc đọc với 'order =" F "' và transposing. Tôi đoán hai phương pháp này có cùng một đối tượng. – Shai

+0

Cảm ơn! Bạn nên biết về đối số 'order', ngay cả khi transposing mang lại kết quả tương tự. – Ian

Các vấn đề liên quan