如何创建一个其元素为其他numpy数组对象的numpy数组?

时间:2020-02-20 05:00:09

标签: python arrays python-3.x numpy

我发现自己需要创建一个dtype =“ object”的numpy数组,其元素本身就是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 个答案:

答案 0 :(得分:1)

如果数组为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)