Как создать более эффективный структурированный / re c массив в numpy - PullRequest
0 голосов
/ 11 апреля 2020

Я создал массив re c в numpy следующим образом. Это самый эффективный способ создать это?

my_array = np.array([(np.datetime64('1970-01-01'),
               np.array([np.zeros(12), np.zeros(12)], dtype='float64'),
               np.array([np.zeros(12), np.zeros(12)], dtype='uint64'),
               np.array([np.zeros(12), np.zeros(12)], dtype='uint64'),
               np.array([np.empty(12, dtype='<M8[us]'),
                         np.empty(12, dtype='<M8[us]')]),
               np.array([np.empty(12), np.empty(12)], dtype='object'),
               np.array([np.empty(1, dtype='uint64'),
                         np.empty(1, dtype='uint64')]))],
               dtype=[('index', 'datetime64[us]'), ('price', 'object'), ('quantity', 'object'),
                      ('id', 'object'), ('timestamp', 'object'), ('customer', 'object'),
                      ('action', 'object')])

Как получить доступ ко всем элементам в действии и получить первый из них. Например, действие заключается в следующем, но я не могу извлечь второй элемент из каждого из массивов.

[[array([[1],
   [0]], dtype=uint64)]
 [array([[1],
   [0]], dtype=uint64)]
 [array([[1],
   [1]], dtype=uint64)]

1 Ответ

1 голос
/ 11 апреля 2020

Просмотр массива:

In [302]: my_array.shape                                                                               
Out[302]: (1,)
In [303]: my_array['action']                                                                           
Out[303]: 
array([array([[0],
       [0]], dtype=uint64)], dtype=object)
In [304]: my_array['action'].shape                                                                     
Out[304]: (1,)
In [305]: my_array['action'][0]                                                                        
Out[305]: 
array([[0],
       [0]], dtype=uint64)

Чтобы попасть в массив (2,1), вам нужно выбрать поле 'action' и первый (единственный) элемент массива.

In [306]: my_array.dtype                                                                               
Out[306]: dtype([('index', '<M8[us]'), ('price', 'O'), ('quantity', 'O'), ('id', 'O'), ('timestamp', 'O'), ('customer', 'O'), ('action', 'O')])

Указав dtype типа 'O', вы добавили ссылочный слой. Это дает дополнительную гибкость.

Вы часто используете этот шаблон:

In [313]: np.array([np.zeros(12), np.zeros(12)], dtype='float64')                                      
Out[313]: 
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
In [314]: _.shape                                                                                      
Out[314]: (2, 12)
In [315]: np.zeros((2,12),dtype='float64')                                                             
Out[315]: 
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
...