我发现自己需要创建一个 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 似乎试图强制数据“有意义”,尽管我尽了最大努力阻止它这样做......
最佳答案
如果数组是一维,则赋值工作正常:
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()
(一个 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 列表嵌套在右侧,我们可以直接分配给二维数组:
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)
关于python - 如何创建一个 numpy 数组,其元素是其他 numpy 数组对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60313171/