scipy和保存mat文件(.mat matlab数据文件)的结构 [英] scipy and preserving mat file (.mat matlab data file) structure

查看:357
本文介绍了scipy和保存mat文件(.mat matlab数据文件)的结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



  dt = {'名字':[u'OSversInt',u'Desc',u'OSversStr',\ 
... u'OSname',u'platform',u'Board'],\
...'格式':['O','O','O','O','O','O']}

aa = np.array([[np .array([[([15]],[u''],[u'5.0,1'],\
... [u'Android'],[u'main'], [u'MSM8960'])]],np.dtype(dt))]] \
...,np.dtype(object))

预期结果:



b
$ b

  aa = scipy.io.loadmat('file.mat')

产生下面的结果。

$ $ $ $ $ $ $ $ $ $ $ $ aa = array([[array([[([[15]],[],[u'5.0.1 '','u'Android'],[u'main'],[u'MSM8960'])]],
dtype = [('OSversInt','O'),('Desc',' O'),('OSversStr','O'),
('OSname','O'),('platform','O'),('Board','O')])] ],dtype = object)

实际结果 -


$ b $

 数组([[[[[15]],[u''],[u'5.0.1'],[u' Android'],[u'main'] 
,[u'MSM8960'])]]]],dtype = object)

如何使我的实际结果符合我的预期结果?
这对于保留现有的mat文件结构是必不可少的。

解决方案

在Octave中,我创建了一个包含结构对象的单元格:

 八度:14  - ; y = {x} 
y =
{
[1,1] =

包含字段的标量结构:

OSversInt = 15
Desc =
OSverStr = 5.0.1
OSname = Android

}
八度:15>保存stack32723802.mat -V7 y

numpy 我将它加载为:

$ p $ In [376]:L = loadmat('stack32723802.mat')
In [377]:L ['y']
Out [377]:
array([[array([[([15.0]],[],['5.0.1'], '''))]],
dtype = [('OSversInt','O'),('Desc','O'),('OSverStr','O'),('OSname', 'O')])]],
dtype = object)

这是一个2d对象数组(1,1),一个项目,也是2d(1,1),与复合dtype。

 在[390]中:y = L ['y'] 
In [391]:y [0,0]
Out [391]:
array [[[ ('''''','O'),['Android'])]],
dtype = [('OSversInt','O' '['OSname','O')])
$ b $ 392]:[[15.0]],[],['5.0.1'],['Android'])

在[394]:y [0,0] ['OSversInt' ]
输出[394]:ar在[395]中:y [0,0] ['OSname']
Out [[array [(15]]]]],dtype = object)
$ b [ 395]:
array([[array(['Android'],
dtype ='< U7')]],dtype = object)
/ pre>

第四个实际结果是产生最高维度数组的结果 np.array

首先创建内部结构化数组:

  In [405 ]:dt = y.item()。dtype 
在[406]:item =([[15.0]],[],['5.0.1'],['Android'])
在[407]中:array1 = np.array([[item]],dtype = dt)
在[408]:array1
Out [408]:
array [[[ [15.0]],[],['5.0.1'],['Android'])]],
dtype = [('OSversInt','O'),('Desc','O' ),('OSverStr','O'),('OSname','O')])

如果我只是把它包装在一个二维对象数组中,我得到一个4d数组:

  In [409]:np。 array([[array1]],dtype = object)
Out [409]:array([[[[[[15.0]],[],['5.0 .1'],['Android'])]]]],dtype = object)

如果相反,我创建一个空的二维对象数组,并插入这个内部数组,我得到一些匹配 loadmat 结果:



在[410]中:z = np.empty((1,1),dtype = object)
在[411]中:z [0,0] = np ([[item]],dtype = dt)
In [412]:z
Out [412]:
array [[[array([[(15.0] ,'','',''),['Android'])]],
dtype = [('OSversInt','O' OSverStr','O'),('OSname','O')])]],dtype = object)


After referring to scipy and numpy docs for a day and a half, I tried doing this -

dt = {'names':[u'OSversInt',u'Desc',u'OSversStr',\
... u'OSname',u'platform',u'Board'],\
...'formats':['O','O','O','O','O','O']}

aa = np.array([[ np.array([[ ([[15]],[u''],[u'5.0,1'],\
... [u'Android'],[u'main'],[u'MSM8960'])]], np.dtype(dt))]]\
... ,np.dtype(object))

Expected outcome:

Expected because when I do

aa = scipy.io.loadmat('file.mat')

yields the below outcome.

aa = array([[ array([[ ([[15]], [], [u'5.0.1'], [u'Android'], [u'main'], [u'MSM8960'])]], 
          dtype=[('OSversInt', 'O'), ('Desc', 'O'), ('OSversStr', 'O'),
    ('OSname', 'O'), ('platform', 'O'), ('Board', 'O')])]], dtype=object)

Actual outcome -

array([[[[ ([[15]], [u''], [u'5.0.1'], [u'Android'], [u'main']
,[u'MSM8960'])]]]], dtype=object)

How do I make my actual outcome match my expected outcome? This is essential to preserve the existing mat file structure.

解决方案

In Octave I created a cell with a structure object:

octave:14> y={x}
y = 
{
  [1,1] =

    scalar structure containing the fields:

      OSversInt =  15
      Desc = 
      OSverStr = 5.0.1
      OSname = Android

}
octave:15> save stack32723802.mat -V7 y

In numpy I load it as:

In [376]: L=loadmat('stack32723802.mat')
In [377]: L['y']
Out[377]: 
array([[ array([[([[15.0]], [], ['5.0.1'], ['Android'])]], 
      dtype=[('OSversInt', 'O'), ('Desc', 'O'), ('OSverStr', 'O'), ('OSname', 'O')])]], 
      dtype=object)

That's a 2d object array (1,1), with one item, which is also 2d (1,1), with the compound dtype.

In [390]: y=L['y']
In [391]: y[0,0]
Out[391]: 
array([[([[15.0]], [], ['5.0.1'], ['Android'])]], 
      dtype=[('OSversInt', 'O'), ('Desc', 'O'), ('OSverStr', 'O'), ('OSname', 'O')])

In [392]: y[0,0][0,0]
Out[392]: ([[15.0]], [], ['5.0.1'], ['Android'])

In [394]: y[0,0]['OSversInt']
Out[394]: array([[array([[ 15.]])]], dtype=object)

In [395]: y[0,0]['OSname']
Out[395]: 
array([[array(['Android'], 
      dtype='<U7')]], dtype=object)

The 4d 'actual outcome' is the result of np.array producing the highest dimensional array it can.

First create the inner structured array:

In [405]: dt=y.item().dtype
In [406]: item=([[15.0]], [], ['5.0.1'], ['Android'])
In [407]: array1 = np.array([[item]], dtype=dt)
In [408]: array1
Out[408]: 
array([[([[15.0]], [], ['5.0.1'], ['Android'])]], 
      dtype=[('OSversInt', 'O'), ('Desc', 'O'), ('OSverStr', 'O'), ('OSname', 'O')])

If I just wrap it in a 2d object array, I get a 4d array:

In [409]: np.array([[array1]], dtype=object)
Out[409]: array([[[[([[15.0]], [], ['5.0.1'], ['Android'])]]]], dtype=object)

But if instead I create an empty 2d object array, and insert this inner array, I get something that matches the loadmat result:

In [410]: z=np.empty((1,1),dtype=object)
In [411]: z[0,0]=np.array([[item]], dtype=dt)
In [412]: z
Out[412]: 
array([[ array([[([[15.0]], [], ['5.0.1'], ['Android'])]], 
      dtype=[('OSversInt', 'O'), ('Desc', 'O'), ('OSverStr', 'O'), ('OSname', 'O')])]], dtype=object)

这篇关于scipy和保存mat文件(.mat matlab数据文件)的结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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