Как я могу создать массив numpy, элементами которого являются другие numpy объекты массива? - PullRequest
1 голос
/ 20 февраля 2020

Мне нужно создать массив numpy для dtype = "object", чьи элементы сами являются numpy массивами. Я могу сделать это, если массивы имеют разную длину:

arr_of_arrs = np.empty((2,2), dtype=np.object)
arr_list = [np.arange(i) for i in range(4)]
arr_of_arrs.flat[:] = arr_list
print(arr_of_arrs)

array([[array([], dtype=int32), array([0])],
   [array([0, 1]), array([0, 1, 2])]], dtype=object)

Но если они имеют одинаковую длину, это не работает, и я не совсем уверен, как он генерирует значения дает мне:

arr_list = [np.arange(2) for i in range(4)]
arr_of_arrs.flat[:] = arr_list
print(arr_of_arrs)

[[0 1]
[0 1]]

Это вообще выполнимо? numpy, кажется, пытается заставить данные "осмыслить", несмотря на все мои усилия по предотвращению этого ...

1 Ответ

1 голос
/ 21 февраля 2020

Если массив 1d, назначение работает нормально:

In [767]: arr = np.empty(4,object)                                                             
In [768]: arr[:] = [np.arange(6) for _ in range(4)]                                            
In [769]: arr                                                                                  
Out[769]: 
array([array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5]),
       array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])], dtype=object)
In [770]: arr.reshape(2,2)                                                                     
Out[770]: 
array([[array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])],
       [array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])]],
      dtype=object)

Мы также можем начать с (2,2), но присвоить ravel() (a view):

In [771]: arr = np.empty((2,2),object)                                                         
In [772]: arr.ravel()[:] = [np.arange(6) for _ in range(4)]                                    
In [773]: arr                                                                                  
Out[773]: 
array([[array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])],
       [array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])]],
      dtype=object)

flat, по-видимому, сериализует RHS:

In [774]: arr.flat = [np.arange(6) for _ in range(4)]                                          
In [775]: arr                                                                                  
Out[775]: 
array([[0, 1],
       [2, 3]], dtype=object)

Если список RHS правильно вложен, мы можем напрямую назначить массив 2d:

In [779]: alist = Out[770].tolist()                                                            
In [780]: alist                       # list of lists of arrays                                                         
Out[780]: 
[[array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])],
 [array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])]]
In [781]: arr = np.empty((2,2),object)                                                         
In [782]: arr[:] = alist                                                                       
In [783]: arr                                                                                  
Out[783]: 
array([[array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])],
       [array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])]],
      dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...