在一天半的时间里,我提到了枕骨和矮胖的医生,我试着这样做-
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))预期结果:
因为当我这么做的时候
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)实际结果-
array([[[[ ([[15]], [u''], [u'5.0.1'], [u'Android'], [u'main']
,[u'MSM8960'])]]]], dtype=object)如何使我的实际结果与我的预期结果相匹配?--这对于保存现有的mat文件结构至关重要。
发布于 2015-09-22 21:52:58
在Octave中,我创建了一个带有结构对象的单元:
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在numpy中,我将其加载为:
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)这是一个2d对象数组(1,1),包含一个项,也是2d (1,1),具有复合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)4d的“实际结果”是np.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')])如果我只是将它封装在一个2d对象数组中,就会得到一个4d数组:
In [409]: np.array([[array1]], dtype=object)
Out[409]: array([[[[([[15.0]], [], ['5.0.1'], ['Android'])]]]], dtype=object)但是,如果我创建一个空的2d对象数组,并插入这个内部数组,则会得到与loadmat结果匹配的内容:
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)发布于 2015-09-22 21:27:03
基于hpaulj的评论,您可能正在寻找
aa = np.empty((1,1), dtype='O')
aa[0,0] = np.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')])产额
In [39]: aa
Out[39]:
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)当您想要将任意Python对象(例如NumPy数组或列表)放置到NumPy数组中时,dtype必须是object。在这种情况下,使用np.array构造失败,因为这个函数解释内部序列 (元组除外)作为要递归的值,而不是作为原子元素。
因此,创建这些嵌套对象数组的诀窍是首先创建外部对象数组:
aa = np.empty((1,1), dtype='O')然后将所需的值赋值给数组的单元格:
aa[0,0] = ...注意,dtype object的嵌套object数组不允许您利用NumPy的快速(主要是数字)函数。它们与它们包含的Python对象的内存占用量本质上是相同的,从性能上看,它们通常不会比普通Python列表更好。
https://stackoverflow.com/questions/32723802
复制相似问题