将元组列表广播到数组中出现Numpy ValueError错误

3

我在使用numpy广播时发现了一些奇怪的行为。问题如下所示,运行第一段代码将会产生一个错误:

A = np.ones((10))
B = np.ones((10, 4))
C = np.ones((10))
np.asarray([A, B, C])

ValueError: could not broadcast input array from shape (10,4) into shape (10)

如果我使用B = np.expand_dims(B, axis=0)来扩展B的维度,它将成功创建数组,但它现在的维度是错误的(这并不令人意外):

array([array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]),
   array([[[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]]]),
   array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])], dtype=float32)

为什么第一个示例无法广播,并且我如何得到像下面这样的数组(请注意,第二个数组周围只有双括号)?任何反馈都将不胜感激。
array([array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]),
   array([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]]),
   array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])], dtype=object)

np.hstack([A[:,None], B, C[:,None]]) 的翻译是什么? - Divakar
这并不完全可行,因为它会创建一个新的形状为(10,6)的数组(如上面的示例),而不是我需要的(3,)(1,3) - andkir
所以,您需要一个形状为(3,)的对象数组? - Divakar
是的,更精确地说,一旦我将这些中的5个连接(或附加)在一起,它们需要成为形状为(5,3)的。 - andkir
1
所有数组中的常见第一维(10)会使np.array进入错误的路径,试图创建一个大小为(10,?)的数组。请记住,np.array的默认行为是创建多维(数值)数组。创建对象数组是一个后备选项。出现此错误时还有另一种可能性。 - hpaulj
谢谢,@hpaulj,这很有道理!也解释了下面的答案为什么有效! - andkir
1个回答

3
包括例如None,可以防止广播,因此这种解决方法是可选的:
np.asarray([A, B, C, None])[:-1]

以下是结果:

array([array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]),
       array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]]),
       array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])], dtype=object)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接