Python: извлечение внутренних значений из неструктурированного списка с одним элементом - PullRequest
0 голосов
/ 26 января 2020

В результате открытия файла .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 Ответ

1 голос
/ 26 января 2020

copy-n-paste создает список из 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) числовой c массив.

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')])

Последний является сложным; Я думаю, что это был struct в MATLAB. Вот форма (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]])

Единственный элемент var4, извлеченный из (1,1) формы MATLAB:

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]. То же самое, немного другое индексирование.

...