Python:使用一个元素从非结构化列表中提取内部值

时间:2020-01-26 11:49:37

标签: python-3.x list numpy numpy-ndarray flatten

由于打开了.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(),但这是错误的方法。

如何解析此类列表中的元素?谢谢。

1 个答案:

答案 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]进行比较。一样,索引稍有不同。