Преобразование ndarray списков в ndarray - PullRequest
0 голосов
/ 17 июня 2020

nda.shape - (2,2), преобразовать его в (2,2,2)

dtypes = [('a', np.float64), ('b', object)]
nda = np.zeros((2,2), dtype = dtypes)

nda['b'][0,0] = [1,2]
nda['b'][1,0] = [2,3]
nda['b'][0,1] = [3,4]
nda['b'][1,1] = [9,5]

Решение должно дать: nda['b'][0,0,1]==2, nda['b'][1,1,0]==9 et c.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вы создали странную структуру; вы не можете просто изменить его форму:

In [1]: dtypes = [('a', np.float64), ('b', object)] 
   ...: nda = np.zeros((2,2), dtype = dtypes) 
   ...:  
   ...: nda['b'][0,0] = [1,2] 
   ...: nda['b'][1,0] = [2,3] 
   ...: nda['b'][0,1] = [3,4] 
   ...: nda['b'][1,1] = [9,5]   

Он имеет 2 поля, одно с числами, другое со списками:

In [2]: nda                                                                     
Out[2]: 
array([[(0., list([1, 2])), (0., list([3, 4]))],
       [(0., list([2, 3])), (0., list([9, 5]))]],
      dtype=[('a', '<f8'), ('b', 'O')])

Поле списка:

In [3]: nda['b']                                                                
Out[3]: 
array([[list([1, 2]), list([3, 4])],
       [list([2, 3]), list([9, 5])]], dtype=object)
In [4]: _.shape                                                                 
Out[4]: (2, 2)

Если преобразовать в 1d, мы можем stack (или иным образом объединить с concatenate):

In [5]: nda['b'].ravel()                                                        
Out[5]: 
array([list([1, 2]), list([3, 4]), list([2, 3]), list([9, 5])],
      dtype=object)
In [6]: np.stack(nda['b'].ravel())                                              
Out[6]: 
array([[1, 2],
       [3, 4],
       [2, 3],
       [9, 5]])
In [7]: np.stack(nda['b'].ravel()).reshape(2,2,2)                               
Out[7]: 
array([[[1, 2],
        [3, 4]],

       [[2, 3],
        [9, 5]]])

В общем, если у вас есть массив списков или массивов dtype, его можно объединить в один (numeri c) массив с версией сортировки concatenate, но он должен быть 1d, `` повторяемый '' массивов / списков.

И, да, распаковка поля во вложенный список дает что-то, что может быть преобразовано обратно в массив (2,2,2):

In [14]: _2['b'].tolist()                                                       
Out[14]: [[[1, 2], [3, 4]], [[2, 3], [9, 5]]]

(Вы не можете просто поместить эти массивы (или списки) обратно в массив nda. Тип dtype равен неправильно.)

С другим dtype (поле `b состоит из 2 целых чисел, а не более общего c объекта):

In [10]: dtypes = [('a', np.float64), ('b', int, (2,))] 
    ...: nda = np.zeros((2,2), dtype = dtypes) 
    ...:  
    ...: nda['b'][0,0] = [1,2] 
    ...: nda['b'][1,0] = [2,3] 
    ...: nda['b'][0,1] = [3,4] 
    ...: nda['b'][1,1] = [9,5]                                                  
In [11]: nda                                                                    
Out[11]: 
array([[(0., [1, 2]), (0., [3, 4])],
       [(0., [2, 3]), (0., [9, 5])]],
      dtype=[('a', '<f8'), ('b', '<i8', (2,))])
In [12]: nda['b']                                                               
Out[12]: 
array([[[1, 2],
        [3, 4]],

       [[2, 3],
        [9, 5]]])
0 голосов
/ 17 июня 2020

Попробуйте следующее

nda = np.resize(nda, (2,2,2))
nda.shape

Результаты

(2,2,2)
...