Python 如何创建元素为其他numpy数组对象的numpy数组?
我发现自己需要创建一个dtype=“object”的numpy数组,其元素本身就是numpy数组。如果阵列长度不同,我可以做到这一点:Python 如何创建元素为其他numpy数组对象的numpy数组?,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,我发现自己需要创建一个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
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似乎试图强迫数据“有意义”,尽管我尽了最大努力阻止它这样做…如果数组是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视图
):
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)
如果
arr\u of\u arrs
以一维数组开始,例如np.empty(4,object)
,这种赋值效果会更好。如果需要,您可以稍后对其进行重塑flat
正在对两侧进行展平和迭代,这会打乱此分配arr\u of_arrays.ravel()[:]=…
效果也更好。@hpaulj效果很好!回答这个问题,我将投票并接受。
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)