我想创建一个numpy数组 b ,其中每个组件都是2D矩阵,其尺寸由向量 a < / em> 。
以下内容使我满意:
>>> a = [3,4,1]
>>> b = [np.zeros((a[i], a[i - 1] + 1)) for i in range(1, len(a))]
>>> np.array(b)
array([ array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]]),
array([[ 0., 0., 0., 0., 0.]])], dtype=object)
但是,如果我发现这种病理情况无法正常工作
>>> a = [2,1,1]
>>> b = [np.zeros((a[i], a[i - 1] + 1)) for i in range(1, len(a))]
>>> b
[array([[ 0., 0., 0.]]), array([[ 0., 0.]])]
>>> np.array(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (3) into shape (1)
答案 0 :(得分:1)
这有点奇怪。通常,numpy会尝试根据np.array
的输入创建一个具有通用数据类型的数组。数组列表将被解释为新维度。例如,np.array([np.zeros(3, 1), np.zeros(3, 1)])
将产生一个2 x 3 x 1
数组。因此,只有在列表中的数组形状匹配时,才会发生这种情况。否则,您最终将得到一个数组数组(带有dtype=object
),正如所评论的那样,这实际上不是理想的情况。
但是,当第一个尺寸匹配时,您的错误似乎发生了。 Numpy由于某种原因尝试以某种方式广播阵列,但失败了。只要数组之间的第一个维度匹配,即使数组具有更高的维度,我也可以重现您的错误。
我知道这不是解决方案,但这不适合发表评论。正如@roganjosh所指出的那样,制作这种数组确实没有任何好处。最好坚持使用数组列表以提高可读性,并避免创建这些数组的成本。
答案 1 :(得分:0)
我将提出该问题的解决方案,但要考虑到评论中所说的内容。 Numpy数组未对齐会阻止大多数有用的操作发挥作用。考虑改用列表。
话虽如此,确实是个奇怪的错误。通过分配一个基本的for循环而不是使用np.array
调用,我可以正常工作。
a = [2,1,1]
b = np.zeros(len(a)-1, dtype=object)
for i in range(1, len(a)):
b[i-1] = np.zeros((a[i], a[i - 1] + 1))
结果:
>>> b
array([array([[0., 0., 0.]]), array([[0., 0.]])], dtype=object)