【问题标题】:How can I fill a numpy array with empty builtin lists?如何用空的内置列表填充 numpy 数组?
【发布时间】:2019-12-14 05:40:25
【问题描述】:

我正在用未知大小的列表填充一个 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 之类的东西,但我想保留源数据,而不是每个 bin 中的统计信息。

【问题讨论】:

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

标签: python numpy


【解决方案1】:

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)

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

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 2011-07-29
    • 1970-01-01
    • 2018-09-18
    • 2019-12-28
    • 1970-01-01
    • 2016-12-13
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多