我发现自己需要创建一个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似乎尽力将数据强制为“有意义的”,尽管我尽力防止这样做。
答案 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)