由于打开了.mat
(MatLab)文件,我收到了一个非结构化列表,其中一个元素为:
list_1 = [(np.array(['charge'], dtype='<U6'), np.array([[24]], dtype=float), np.array([[2.0080e+03, 4.0000e+00, 2.0000e+00, 1.3000e+01, 8.0000e+00,
1.7921e+01]]), np.array([[(np.array([[3.87301722, 3.47939356, 4.00058782, 4.01239519, 4.01970806]]), np.array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]]), np.array([[0.000000e+00, 2.532000e+00, 5.500000e+00, 8.344000e+00,
1.112500e+01, 1.389100e+01, 1.667200e+01, 1.950000e+01,
2.228200e+01, 2.506300e+01, 2.782800e+01, 3.064100e+01,
3.345300e+01, 3.621900e+01, 3.973500e+01, 4.257800e+01]]))]],
dtype=[('Res1', 'O'), ('Rea2', 'O'), ('Res3', 'O')]))]
我想提取每个np.array
以分隔Variable
。
预期结果是:
var1 = np.array([[2.0080e+03, 4.0000e+00, 2.0000e+00, 1.3000e+01, 8.0000e+00,
1.7921e+01]])
var2 = np.array([[(np.array([[3.87301722, 3.47939356, 4.00058782, 4.01239519, 4.01970806]])
var3 = np.array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]])
var4 = np.array([[0.000000e+00, 2.532000e+00, 5.500000e+00, 8.344000e+00,
1.112500e+01, 1.389100e+01, 1.667200e+01, 1.950000e+01,
2.228200e+01, 2.506300e+01, 2.782800e+01, 3.064100e+01,
3.345300e+01, 3.621900e+01, 3.973500e+01, 4.257800e+01]])
我试图将list_1
移到np.array
并制成np.squeeze(array_1).item()
,但这是错误的方法。
如何解析此类列表中的元素?谢谢。
答案 0 :(得分:1)
复制n粘贴会生成一个1元素列表:
In [591]: list_1 = [(np.array(['charge'], dtype='<U6'), np.array([[24]], dtype=float), np.array([
...: [2.0080e+03, 4.0000e+00, 2.0000e+00, 1.3000e+01, 8.0000e+00,
...: 1.7921e+01]]), np.array([[(np.array([[3.87301722, 3.47939356, 4.00058782, 4.01
...: 239519, 4.01970806]]), np.array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
...: 1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
...: 1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
...: 1.50732203e+00, 1.51022594e+00, 1.51185336e+00]]), np.array([[0.000000e+00,
...: 2.532000e+00, 5.500000e+00, 8.344000e+00,
...: 1.112500e+01, 1.389100e+01, 1.667200e+01, 1.950000e+01,
...: 2.228200e+01, 2.506300e+01, 2.782800e+01, 3.064100e+01,
...: 3.345300e+01, 3.621900e+01, 3.973500e+01, 4.257800e+01]]))]],
...: dtype=[('Res1', 'O'), ('Rea2', 'O'), ('Res3', 'O')]))]
In [592]: len(list_1)
Out[592]: 1
该元素是一个4元素元组:
In [593]: list_1[0]
Out[593]:
(array(['charge'], dtype='<U6'),
array([[24.]]),
array([[2.0080e+03, 4.0000e+00, 2.0000e+00, 1.3000e+01, 8.0000e+00,
1.7921e+01]]),
array([[(array([[3.87301722, 3.47939356, 4.00058782, 4.01239519, 4.01970806]]), array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]]), array([[ 0. , 2.532, 5.5 , 8.344, 11.125, 13.891, 16.672, 19.5 ,
22.282, 25.063, 27.828, 30.641, 33.453, 36.219, 39.735, 42.578]]))]],
dtype=[('Res1', 'O'), ('Rea2', 'O'), ('Res3', 'O')]))
In [594]: type(_)
Out[594]: tuple
In [595]: len(__)
Out[595]: 4
然后我们可以将其分解为4个变量:
In [596]: var1,var2,var3,var4=list_1[0]
In [597]: var1
Out[597]: array(['charge'], dtype='<U6') # a string
In [598]: var2
Out[598]: array([[24.]]) # a number, (1,1) array
In [599]: var3
Out[599]:
array([[2.0080e+03, 4.0000e+00, 2.0000e+00, 1.3000e+01, 8.0000e+00,
1.7921e+01]])
var3
是一个矩阵,这里是(1,6)数字数组。
In [600]: var4
Out[600]:
array([[(array([[3.87301722, 3.47939356, 4.00058782, 4.01239519, 4.01970806]]), array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]]), array([[ 0. , 2.532, 5.5 , 8.344, 11.125, 13.891, 16.672, 19.5 ,
22.282, 25.063, 27.828, 30.641, 33.453, 36.219, 39.735, 42.578]]))]],
dtype=[('Res1', 'O'), ('Rea2', 'O'), ('Res3', 'O')])
这最后一个很复杂;我认为这是MATLAB中的struct
。这是一个(1,1)形状(1个元素,2d)结构的数组,具有3个字段,每个字段包含数组(对象dtype)。
In [601]: var4.shape
Out[601]: (1, 1)
In [602]: var4.dtype
Out[602]: dtype([('Res1', 'O'), ('Rea2', 'O'), ('Res3', 'O')])
我们可以参考:
In [603]: var4[0,0]['Res1']
Out[603]: array([[3.87301722, 3.47939356, 4.00058782, 4.01239519, 4.01970806]])
In [604]: var4[0,0]['Rea2']
Out[604]:
array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]])
In [605]: var4[0,0]['Res3']
Out[605]:
array([[ 0. , 2.532, 5.5 , 8.344, 11.125, 13.891, 16.672, 19.5 ,
22.282, 25.063, 27.828, 30.641, 33.453, 36.219, 39.735, 42.578]])
从(1,1)MATLAB形状中取出var4
的单个元素:
In [631]: var4[0,0]
Out[631]:
(array([[3.87301722, 3.47939356, 4.00058782, 4.01239519, 4.01970806]]), array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]]), array([[ 0. , 2.532, 5.5 , 8.344, 11.125, 13.891, 16.672, 19.5 ,
22.282, 25.063, 27.828, 30.641, 33.453, 36.219, 39.735, 42.578]]))
将其提取为元组:
In [632]: var4[0,0].tolist()
Out[632]:
(array([[3.87301722, 3.47939356, 4.00058782, 4.01239519, 4.01970806]]),
array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]]),
array([[ 0. , 2.532, 5.5 , 8.344, 11.125, 13.891, 16.672, 19.5 ,
22.282, 25.063, 27.828, 30.641, 33.453, 36.219, 39.735, 42.578]]))
In [633]: type(_)
Out[633]: tuple
如果没有[0,0],tolist
会给我们几层列表嵌套[[(....)]]
。
结构化数组名称为:
In [634]: var4.dtype.names
Out[634]: ('Res1', 'Rea2', 'Res3')
和结合了这些名称和[632]中的数组的字典:
In [636]: dd = {name:val for name, val in zip(var4.dtype.names, var4[0,0].tolist())}
In [637]: dd
Out[637]:
{'Res1': array([[3.87301722, 3.47939356, 4.00058782, 4.01239519, 4.01970806]]),
'Rea2': array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]]),
'Res3': array([[ 0. , 2.532, 5.5 , 8.344, 11.125, 13.891, 16.672, 19.5 ,
22.282, 25.063, 27.828, 30.641, 33.453, 36.219, 39.735, 42.578]])}
In [638]: dd["Rea2"]
Out[638]:
array([[-1.20066070e-03, -4.03026848e+00, 1.51273065e+00,
1.50906328e+00, 1.51131819e+00, 1.51277913e+00,
1.51183834e+00, 1.51024540e+00, 1.50779576e+00,
1.50732203e+00, 1.51022594e+00, 1.51185336e+00]])
将此最后一次访问与In[604]
进行比较。一样,索引稍有不同。