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

Python 如何用空的内置列表填充numpy数组?,python,numpy,Python,Numpy,我正在用未知大小的列表填充numpy网格,因为使用list.append比使用np.concatenate更好(不过,也许我在过早地优化) 这些不起作用: foo = np.full((3, 4), []) bar = np.full((3, 4), [], dtype=object) Numpy只是假设my[]是用于填充结果的Numpy数组,并且是错误的形状 它适用于dicts: foo = np.full((3, 4), {}) 有没有办法做到这一点 编辑:事实上,我甚至不知道如何使

我正在用未知大小的列表填充numpy网格,因为使用
list.append
比使用
np.concatenate
更好(不过,也许我在过早地优化)

这些不起作用:

foo = np.full((3, 4), []) 
bar = np.full((3, 4), [], dtype=object) 
Numpy只是假设my
[]
是用于填充结果的Numpy数组,并且是错误的形状

它适用于dicts:

foo = np.full((3, 4), {})
有没有办法做到这一点

编辑:事实上,我甚至不知道如何使用numpy数组来实现这一点。我想要一个2x2网格,每个单元格中有可变长度的列表或数组


编辑2:我真正想要的是类似于
scipy.stats.binned\u statistic\u 2d
的东西,但我不想在每个bin中保留一个统计信息,而是想保留源数据。

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 [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
是创建对象数据类型数组的好工具,填充了各种对象类:

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)

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

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 [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
是创建对象数据类型数组的好工具,填充了各种对象类:

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)

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

另一个关于
full
和可变对象的问题是,它在每个插槽中放置了对相同对象的引用,因此您最终会遇到与使用
[{}创建列表相同的排序问题*3
使用
列表
对象的
numpy.ndarray
没有任何意义。dtype=object的
nd.array
几乎就是一个蹩脚、效率较低的列表。我接受了下面一个很好的答案,@juanpa.arrivillaga,但我想你可能是对的,我会支持@juanpa.arrivillaga所说的。我很失望,被接受的答案甚至没有提到它。如果你能分享更多关于你需要这个的信息,我们也许能找到一个更好的选择。我认为被接受的答案是我问题的正确答案。但我最后做的是制作一个列表列表,使用np.digitize来确定对象的网格目标,每个对象都有x和y位置的历史记录,并在每个网格目标列表中附加一个时间戳+对象引用对。基本上,我试图将(时间,x,y)对象放在二维网格中,而我的源数据在时间戳和位置上都是稀疏的。然后,我对这些网格列表进行后处理,以创建具有代表性的摘要数据。
full
和可变对象的另一个问题是,它会在每个插槽中引用相同的对象,因此最终会遇到与使用
[{}创建列表相同的排序问题*3
使用
列表
对象的
numpy.ndarray
没有任何意义。dtype=object的
nd.array
几乎就是一个蹩脚、效率较低的列表。我接受了下面一个很好的答案,@juanpa.arrivillaga,但我想你可能是对的,我会支持@juanpa.arrivillaga所说的。我很失望,被接受的答案甚至没有提到它。如果你能分享更多关于你需要这个的信息,我们也许能找到一个更好的选择。我认为被接受的答案是我问题的正确答案。但我最后做的是制作一个列表列表,使用np.digitize来确定对象的网格目标,每个对象都有x和y位置的历史记录,并在每个网格目标列表中附加一个时间戳+对象引用对。基本上,我试图将(时间,x,y)对象放在二维网格中,而我的源数据在时间戳和位置上都是稀疏的。然后,我对这些网格列表进行后处理,以创建具有代表性的摘要数据。