簡體   English   中英

將Python字典轉換為3D Matlab矩陣

[英]Converting Python Dictionary to 3D Matlab Matrix

我在Python 3.2中具有以下字典results_dict ,其中鍵字段是字符串值,而值字段是3個數組的列表。 每個數組都有400個浮點值。 我想將此字典轉換為可在Matlab 2017b中使用的數據結構。 但是,如果執行以下命令:

savemat('GridCellResults.mat', results_dict, oned_as='row');

該命令成功執行,但是Matlab無法理解矩陣文件。 因此,我編寫了以下代碼,將上一個字典轉換為3維矩陣(X,Y,Z),其中X是數組的大小(400個元素),Y是每個字典鍵的數組數( 3個數組),Z是字典中元素的數量。 但是,當我執行以下代碼時,出現以下錯誤:

IndexError: only integers, slices ( ), numpy.newaxis ( ), ellipsis ( ... ), numpy.newaxis ( None ) and integer or boolean arrays are valid indices

這是代碼。 任何提示為什么我收到此錯誤。 另外,即使我嘗試不使用移調功能,我也會收到相同的錯誤。

import numpy as np

CARDINALITY = 400            # Number of angular domain values.
NUM_COLUMNS = 3
NUM_CELLS = 114

matlab_array =  np.zeros((CARDINALITY, NUM_COLUMNS, NUM_CELLS))

for key, value in results_dict.items():   
    matlab_array[:, 0, key] = np.transpose(value[0])
    matlab_array[:, 1, key] = np.transpose(value[1])
    matlab_array[:, 2, key] = np.transpose(value[2])

嘗試按照您的描述,我可以成功地編寫和閱讀這樣的詞典

在ipython會話中:

In [48]: from scipy.io import savemat, loadmat
In [49]: adict = {'a':[np.arange(3),np.ones(3),np.array([4,2,1])]}
In [50]: adict['b'] = [np.arange(3),np.ones(3),np.array([4,2,1])]
In [51]: adict
Out[51]: 
{'a': [array([0, 1, 2]), array([1., 1., 1.]), array([4, 2, 1])],
 'b': [array([0, 1, 2]), array([1., 1., 1.]), array([4, 2, 1])]}
In [52]: pwd
Out[52]: '/home/paul/mypy'
In [53]: savemat('stack48385062.mat',adict, oned_as='row')
In [54]: data = loadmat('stack48385062.mat')
In [55]: data
Out[55]: 
{'__globals__': [],
 '__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Mon Jan 22 09:15:31 2018',
 '__version__': '1.0',
 'a': array([[0., 1., 2.],
        [1., 1., 1.],
        [4., 2., 1.]]),
 'b': array([[0., 1., 2.],
        [1., 1., 1.],
        [4., 2., 1.]])}

數組列表(大小固定)轉換為2d數組。

在八度會話中:

>> load stack48385062.mat
>> a
a =
   0   1   2
   1   1   1
   4   2   1
>> b
b =
   0   1   2
   1   1   1
   4   2   1
>>

或創建3d數組(使用數字索引而不是字符串鍵):

In [56]: M=np.zeros([3, 3, 2])
In [57]: for i in range(len(adict)):
    ...:     for j in range(3):
    ...:         v = adict[list(adict.keys())[i]]
    ...:         M[:, j, i] = v[j]
    ...:         
In [58]: M
Out[58]: 
array([[[0., 0.],
        [1., 1.],
        [4., 4.]],

       [[1., 1.],
        [1., 1.],
        [2., 2.]],

       [[2., 2.],
        [1., 1.],
        [1., 1.]]])

>> load stack48385062_1.mat
>> M
M =
ans(:,:,1) =
   0   1   4
   1   1   2
   2   1   1
ans(:,:,2) =
   0   1   4
   1   1   2
   2   1   1

我應該用4個元素數組中的3個組成的列表制作初始字典,這樣跟蹤軌跡轉置會更容易。 MATLAB和numpy具有不同的軸順序,這可能會造成混淆。 savemat嘗試補償。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM