将Python字典转换为3D Matlab矩阵

时间:2018-01-22 15:31:42

标签: python arrays matlab numpy dictionary

我在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 Arrays)和Z是字典中元素的数量。但是,当我执行下面的代码时,我收到以下错误:

IndexError: only integers, slices (), ellipsis ( ... ), numpy.newaxis ( {无{1}}

这是代码。任何线索为什么我收到此错误。即使我尝试没有转置功能,我也会遇到同样的错误。

) and integer or boolean arrays are valid indices

1 个答案:

答案 0 :(得分:1)

尝试按照您的描述,我可以成功地编写和阅读这样的字典

在ipython会话中:

function uriMatches($uri1, $uri2) {
    return normalizeURI($uri1) === normalizeURI($uri2);
}

数组列表(常量)已转换为2d数组。

在Octave会议中:

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.]])}

或创建3d数组(使用数字索引而不是字符串键):

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

我应该使用4个元素数组中的3个列表创建初始字典,因此跟踪轨道转置会更容易。 MATLAB和numpy有不同的轴顺序,这可能会令人困惑。 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 试图补偿。