[英]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.