如何用空的内置列表填充numpy数组?

时间:2019-12-13 21:15:35

标签: python numpy

我正在用一个大小未知的列表填充一个numpy网格,因为list.appendnp.concatenate更好用(尽管我可能过早地进行了优化)。

这些无效:

foo = np.full((3, 4), []) 
bar = np.full((3, 4), [], dtype=object) 

numpy仅假定我的[]是用于填充结果的numpy数组,并且形状错误。

它适用于字典:

foo = np.full((3, 4), {})

有什么办法吗?

编辑:实际上,即使使用numpy数组,我也不知道如何执行此操作。我想要一个2x2的网格,每个单元格中都有可变长度的列表或数组。

编辑2:我真正想要的是类似scipy.stats.binned_statistic_2d的东西,但是我想保留源数据,而不是每个箱中的统计信息。

1 个答案:

答案 0 :(得分:2)

full具有可变对象,即使它起作用也有问题:

In [10]: A = np.full(3,{})                                                      
In [11]: A                                                                      
Out[11]: array([{}, {}, {}], dtype=object)
In [12]: A[0]['k']=2                                                            
In [13]: A                                                                      
Out[13]: array([{'k': 2}, {'k': 2}, {'k': 2}], dtype=object)

In [14]: [{}]*3                                                                 
Out[14]: [{}, {}, {}]

将相同的对象放入每个插槽。

您可以创建一个“空白”对象dtype数组,并从列表中填充它-注意每个元素都是一个“新鲜”列表:

In [15]: A = np.empty((2,2),object)                                             
In [16]: A                                                                      
Out[16]: 
array([[None, None],
       [None, None]], dtype=object)
In [17]: A[:] = [[[] for _ in range(2)] for _ in range(2)]                      
In [18]: A                                                                      
Out[18]: 
array([[list([]), list([])],
       [list([]), list([])]], dtype=object)
In [19]: A[0,0].append(34)                                                      
In [20]: A                                                                      
Out[20]: 
array([[list([34]), list([])],
       [list([]), list([])]], dtype=object)

frompyfunc是创建包含各种对象类的对象dtype数组的好工具:

In [23]: B = np.frompyfunc(lambda x:[],1,1)(np.zeros((2,2)))                    
In [24]: B                                                                      
Out[24]: 
array([[list([]), list([])],
       [list([]), list([])]], dtype=object)
In [25]: B[0,0].append(34)                                                      
In [26]: B                                                                      
Out[26]: 
array([[list([34]), list([])],
       [list([]), list([])]], dtype=object)

这也在为每个元素创建一个“新”列表。