如何使用Matlab数据结构中的多维数组从Python创建Matlab文件? [英] How can I create a Matlab file from Python with multi-dimensional arrays in a Matlab data structure?

查看:227
本文介绍了如何使用Matlab数据结构中的多维数组从Python创建Matlab文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从Python创建一个Matlab文件(* .mat),该文件包含如下所示的Matlab数据结构:

I am trying to create a Matlab file (*.mat) from Python that contains a Matlab data structure that would look like:

s.key1 where key1 is an array of values
s.key2 where key2 is an array of 1D arrays 
s.key3 where key3 is an array of 2D arrays 

如果我使用savemat和字典,则Matlab的输出是一个单元格数组,而不是Matlab的数据结构.

If I use savemat and a dictionary, the Matlab output is a cell array rather than a Matlab data structure.

我尝试使用

np.core.records.fromarrays(data_list, names=q_keys)

,但这似乎不适用于带有2D数组的键.我有2D和3D阵列,都需要采用Matlab结构才能与现有文件格式兼容.有没有办法在Python中做到这一点?

but this doesn't seem to work for keys with 2D arrays. I have both 2D and 3D arrays that need to be in a Matlab structure for compatibility with an existing file format. Is there a way to do this in Python?

谢谢

推荐答案

以下是该任务的一个刺路点:

Here's a stab at the task:

In [292]: dt = np.dtype([('key1',int),('key2',int, (3,)),('key3',object)])
In [293]: arr = np.zeros((5,), dt)
In [294]: arr
Out[294]: 
array([(0, [0, 0, 0], 0), (0, [0, 0, 0], 0), (0, [0, 0, 0], 0),
       (0, [0, 0, 0], 0), (0, [0, 0, 0], 0)],
      dtype=[('key1', '<i8'), ('key2', '<i8', (3,)), ('key3', 'O')])
In [295]: arr['key1']=np.arange(5)
In [296]: arr['key2']=np.arange(15).reshape(5,3)
In [302]: arr['key3']=[1,np.arange(5),np.ones((2,3),int),'astring',[['a','b']]]
In [303]: io.savemat('test.mat', {'astruct':arr})

在八度音阶中:

>> load test.mat
>> format compact
>> astruct
astruct =

  1x5 struct array containing the fields:

    key1
    key2
    key3
>> astruc.key1
error: 'astruc' undefined near line 1 column 1
>> astruct.key1
ans = 0
ans = 1
ans = 2
ans = 3
ans = 4
>> astruct.key2
ans =
  0  1  2
ans =
  3  4  5
ans =
  6  7  8
ans =
   9  10  11
ans =
  12  13  14
>> astruct.key3
ans = 1
ans =
  0  1  2  3  4
ans =
  1  1  1
  1  1  1
ans = astring
ans = ab

返回ipython:

In [304]: d = io.loadmat('test.mat')
In [305]: d
Out[305]: 
{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Wed Jun  6 15:36:23 2018',
 '__version__': '1.0',
 '__globals__': [],
 'astruct': array([[(array([[0]]), array([[0, 1, 2]]), array([[1]])),
         (array([[1]]), array([[3, 4, 5]]), array([[0, 1, 2, 3, 4]])),
         (array([[2]]), array([[6, 7, 8]]), array([[1, 1, 1],
        [1, 1, 1]])),
         (array([[3]]), array([[ 9, 10, 11]]), array(['astring'], dtype='<U7')),
         (array([[4]]), array([[12, 13, 14]]), array([['a', 'b']], dtype='<U1'))]],
       dtype=[('key1', 'O'), ('key2', 'O'), ('key3', 'O')])}

因此,当创建具有intint(3)之类的dtypes的numpy结构化数组时,加载的数组的所有字段都具有dtype对象. loadmat大量使用对象dtype数组来处理MATLAB单元和结构的一般性. loadmat具有各种加载参数,我们可以使用.

So while a created a numpy structured array with dtypes like int and int(3), the loaded array has object dtype for all fields. loadmat makes heavy use of object dtype arrays to handle the generality of MATLAB cells and struct. loadmat has various loading parameters, which we can play with.

这只是基于以前加载MATLAB文件的经验得出的猜测.如果这不是您想要的,我建议您在MATLAB中构造示例数据,将其保存,然后加载以查看loadmat如何构造它.您可能需要来回几次才能找出错误.

This was just a guess based on previous experience loading MATLAB files. If this isn't what you want, I'd suggest constructing sample data in MATLAB, save that, and then load to see how loadmat constructs it. You may have to go back and forth a few times to work out the bugs.

这篇关于如何使用Matlab数据结构中的多维数组从Python创建Matlab文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆