scipy和保存mat文件(.mat matlab数据文件)的结构 [英] scipy and preserving mat file (.mat matlab data file) structure
问题描述
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']
/ pre>
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)
第四个实际结果是产生最高维度数组的结果
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屋!