chỉnh sửa: Trả lời (và câu hỏi phần nào) đã thay đổi đáng kể thành tổng quát hơn. Nó sẽ vẫn hữu ích khi người hỏi sẽ cho chúng tôi biết các loại đối tượng giá trị trong backup
là gì.
Các scipy.io.savemat rõ ràng có thể mất một cuốn từ điển của từ điển của mảng, vì vậy cấu trúc này
from numpy import array
import scipy.io
data = {
'bigdata' : {
'a' : array([1, 2, 3]),
'b' : array([1, 2, 3]),
'c' : array([1, 2, 3]),
}
}
scipy.io.savemat('test.mat', data)
tải vào matlab như
>> load test.mat
>> bigdata
bigdata =
a: [3x1 int64]
c: [3x1 int64]
b: [3x1 int64]
Tôi tưởng tượng các bộ từ điển có thể được lồng lên đến giới hạn đệ quy của python, vì việc triển khai thực hiện đệ quy. Tôi đã kiểm tra 6 cấp độ từ điển làm tổ. Edit: Bây giờ bạn đang hỏi về một cấu trúc như thế này:
data = {
'key1' : ['a' : apple, 'b' : banana],
'key2' : ['c' : crabapple, 'd' : dragonfruit],
...
}
và bạn đã không quy định gì táo, chuối vv. Nó phụ thuộc vào dữ liệu nào từ các đối tượng Python bạn muốn trong các đối tượng Matlab. Tôi đã thử nghiệm một vài lớp như str (chuyển đổi thành mảng char), thiết lập (không chuyển thành mảng), và danh sách (mảng nếu đồng nhất, mảng ký tự nếu một số chuỗi, một số số). Đoạn mã trông khá kiểu vịt, vì vậy nếu các đối tượng này có bất kỳ giao diện giữ dữ liệu chung nào thì nó sẽ đi qua; Tôi trình bày một đoạn trích đây của most relevant bit cho phiên bản matlab5:
def to_writeable(source)
if isinstance(source, np.ndarray):
return source
if source is None:
return None
# Objects that have dicts
if hasattr(source, '__dict__'):
source = dict((key, value) for key, value in source.__dict__.items()
if not key.startswith('_'))
# Mappings or object dicts
if hasattr(source, 'keys'):
dtype = []
values = []
for field, value in source.items():
if (isinstance(field, basestring) and
not field[0] in '_'):
dtype.append((field,object))
values.append(value)
if dtype:
return np.array([tuple(values)] ,dtype)
else:
return None
# Next try and convert to an array
narr = np.asanyarray(source)
if narr.dtype.type in (np.object, np.object_) and \
narr.shape ==() and narr == source:
# No interesting conversion possible
return None
return narr
Điều gần gũi nhất với đối tượng từ điển Python là các cấu trúc MATLAB, nơi các fieldnames là chìa khóa từ điển – Amro
Tôi chỉ viết một mã bán giả. Sự hiểu biết của bạn về cấu trúc dữ liệu là chính xác. Nhưng mã trên bạn đã đề cập có thể được lưu bằng cách sử dụng 'sio.savemat (" doom.mat ", dữ liệu, oned_as = 'column');' – Harman
@Thomas: +1 trên thực tế, gọi 'scipy.io.savemat ('file.mat', data) ', sau đó tải tệp trong MATLAB, thực sự của nó là kiểu' struct' với tên trường như mong đợi. (BTW Tôi nghĩ rằng bạn đã bỏ lỡ dấu phẩy, tôi đã sửa nó nhưng bị ghi đè bởi chỉnh sửa gần đây của bạn) – Amro