【问题标题】:Converting Python Dictionary to 3D Matlab Matrix将 Python 字典转换为 3D Matlab 矩阵
【发布时间】:2018-01-22 15:31:41
【问题描述】:

我在 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 (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])

【问题讨论】:

  • 这是因为您不能将字符串用作数组中的索引。尝试在 for 循环中运行整数计数器并将其用作最后一个索引而不是键。如果您想确保可以按相同顺序访问元素,可以将字典转换为 collections.OrderedDict

标签: python arrays matlab numpy dictionary


【解决方案1】:

按照你的描述,我可以成功写读这样的字典

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

数组列表(大小不变)被转换为二维数组。

在 Octave 会话中:

>> 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 试图补偿。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多