我正在用一个大小未知的列表填充一个numpy网格,因为list.append
比np.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
的东西,但是我想保留源数据,而不是每个箱中的统计信息。
答案 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)
这也在为每个元素创建一个“新”列表。