在具有不同维度的numpy中创建数组数组
Creating array of arrays in numpy with different dimensions
我正在尝试创建一组 numpy 数组,每个数组都有不同的维度。
到目前为止,它似乎还不错。例如,如果我 运行:
np.array([np.zeros((10,3)), np.zeros((11,8))])
结果是:
array([ array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]),
array([[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.]])], dtype=object)
两个矩阵的维度完全不同,生成数组没有问题。但是,如果两个矩阵的第一个维度相同,就不行了:
np.array([np.zeros((10,3)), np.zeros((10,8))])
Traceback (most recent call last):
File "<ipython-input-123-97301e1424ae>", line 1, in <module>
a=np.array([np.zeros((10,3)), np.zeros((10,8))])
ValueError: could not broadcast input array from shape (10,3) into shape (10)
这是怎么回事?
谢谢!
之前已经讨论过了(Why do I get error trying to cast np.array(some_list) ValueError: could not broadcast input array;
)。基本上 np.array
做三件事之一:
制作一个 n-dimensional 基本 dtype 数组,例如漂浮。
创建对象数据类型数组
报错,说前两个不可以。
这后两个备选方案是备用选项,仅在第一个不可能时才采用。
在不深入了解编译代码如何工作的细节的情况下,显然
会发生什么
np.array([np.zeros((10,3)), np.zeros((10,8))])
是它先看到共同的第一个维度,并由此推导出它可以取第一个选择。看起来它初始化了一个 (10,2) 数组(列表中有 2 个项目),并试图将第一个数组放入第一行,因此尝试将 (10,3) 数组放入 (10, ) 插槽。
因此,如果您真的想要一个对象 dtype 数组,并且不符合第一种或第三种情况,则需要进行某种 'round-about' 创建。
PaulP 和我一直在
探索替代方案
早些时候:
在这个问题中我建议这样迭代:
A=np.empty((3,),dtype=object)
for i,v in enumerate(A): A[i]=[v,i]
或者你的情况
In [451]: res = np.empty(2, object)
In [452]: alist = [np.zeros((10,3)), np.zeros((10,8))]
In [453]: for i,v in enumerate(alist):
...: res[i] = v
与其迭代 alist
,不如这样做:
res[:] = alist
在我尝试过的大多数情况下它似乎都有效,但如果您广播错误,请不要感到惊讶。
我正在尝试创建一组 numpy 数组,每个数组都有不同的维度。 到目前为止,它似乎还不错。例如,如果我 运行:
np.array([np.zeros((10,3)), np.zeros((11,8))])
结果是:
array([ array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]),
array([[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.]])], dtype=object)
两个矩阵的维度完全不同,生成数组没有问题。但是,如果两个矩阵的第一个维度相同,就不行了:
np.array([np.zeros((10,3)), np.zeros((10,8))])
Traceback (most recent call last):
File "<ipython-input-123-97301e1424ae>", line 1, in <module>
a=np.array([np.zeros((10,3)), np.zeros((10,8))])
ValueError: could not broadcast input array from shape (10,3) into shape (10)
这是怎么回事?
谢谢!
之前已经讨论过了(Why do I get error trying to cast np.array(some_list) ValueError: could not broadcast input array;
np.array
做三件事之一:
制作一个 n-dimensional 基本 dtype 数组,例如漂浮。
创建对象数据类型数组
报错,说前两个不可以。
这后两个备选方案是备用选项,仅在第一个不可能时才采用。
在不深入了解编译代码如何工作的细节的情况下,显然
会发生什么np.array([np.zeros((10,3)), np.zeros((10,8))])
是它先看到共同的第一个维度,并由此推导出它可以取第一个选择。看起来它初始化了一个 (10,2) 数组(列表中有 2 个项目),并试图将第一个数组放入第一行,因此尝试将 (10,3) 数组放入 (10, ) 插槽。
因此,如果您真的想要一个对象 dtype 数组,并且不符合第一种或第三种情况,则需要进行某种 'round-about' 创建。
PaulP 和我一直在
早些时候:
在这个问题中我建议这样迭代:
A=np.empty((3,),dtype=object)
for i,v in enumerate(A): A[i]=[v,i]
或者你的情况
In [451]: res = np.empty(2, object)
In [452]: alist = [np.zeros((10,3)), np.zeros((10,8))]
In [453]: for i,v in enumerate(alist):
...: res[i] = v
与其迭代 alist
,不如这样做:
res[:] = alist
在我尝试过的大多数情况下它似乎都有效,但如果您广播错误,请不要感到惊讶。