gpt4 book ai didi

python - 当第一个维度的第一个大小匹配时,创建数组的数组失败

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:20 26 4
gpt4 key购买 nike

我偶然发现了我不理解的 np.array 函数的某些行为。此代码按我预期的方式工作:

arr1 = np.zeros((3,2))
arr2 = np.zeros((2,2))

np.array([arr1,arr2])
array([ array([[ 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.]])], dtype=object)

但是这段代码给我一个错误:

arr1 = np.zeros((2,3))
arr2 = np.zeros((2,2))

np.array([arr1,arr2])

ValueError: could not broadcast input array from shape (2,3) into shape (2)

为什么会有区别,第一个维度的大小是否匹配?我怎样才能强制函数按照第一个示例中的方式运行?

最佳答案

numpy array 1.9.2 getting ValueError: could not broadcast input array from shape (4,2) into shape (4) 中所述

对象数组的创建方式发生了变化。在可能的情况下,np.array 尝试创建多维数组。创建一个对象数组一直是后备选择,当输入的形状不匹配时使用。即便如此,它也可能无法预测。

最可靠的方法是创建一个大小合适的空对象数组并插入对象

In [242]: a=np.zeros((2,3));b=np.ones((2,2))

In [243]: arr=np.zeros((2,), object)
In [244]: arr[0]=a; arr[1]=b

In [245]: arr
Out[245]:
array([array([[ 0., 0., 0.],
[ 0., 0., 0.]]),
array([[ 1., 1.],
[ 1., 1.]])], dtype=object)
In [246]: arr[:]=[a,b] # also works

您已经看到 np.array([a.T, b]) 有效。如果我将数组转换为嵌套列表,我会得到一个平面列表的二维数组; 2 和 3 元素列表是最低级别的不兼容对象。

In [250]: np.array([a.tolist(),b.tolist()])
Out[250]:
array([[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],
[[1.0, 1.0], [1.0, 1.0]]], dtype=object)

In [251]: _.shape
Out[251]: (2, 2)

np.array 是经过编译的,因此需要一些挖掘来解码其逻辑。我之前的挖掘表明进行了一些更改以加快从数组创建数组的速度(更像是连接)。此问题可能是该更改的副作用。

要点是:如果你想创建数组的对象数组,不要指望 np.array 能正确完成这项工作。它主要用于制作标量的多维数组。

例如,如果数组大小匹配:

In [252]: np.array([a,a]).shape
Out[252]: (2, 2, 3)

如果我想要一个 2 元素对象数组,我必须使用 arr[...]=[a,a]

关于python - 当第一个维度的第一个大小匹配时,创建数组的数组失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42511025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com