2011-10-07 36 views
6

Tôi có một cấu trúc dữ liệu phức tạpLưu tệp matlab sử dụng python

data = {} 
temp = {} 

data['bigdata'] = temp; 

Sau này tôi sao chép 'chìa khóa' và giá trị 'dữ liệu' từ một số cấu trúc dữ liệu khác vào tạm thời, như thế này

for key in backup.keys(): 
    temp[key] = [] 

for key in backup.keys(): 
    for val in backup[key]: 
     temp[key].append(val); 

Sau đó Nếu tôi làm

sio.savemat(outputMATfile,data,oned_as ='column') 

nó đem lại cho tôi lỗi nói

TTypeError: data type not understood 

Há chẳng phải càng tốt để lưu trữ một cuốn từ điển phức tạp như thế này trong một tập tin matlab, sử dụng python?

Trả lời

6

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 
+0

Đ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

+0

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

+0

@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

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