【问题标题】:Python numpy ValueError: could not broadcast input array from shape (2,2,3) into shape (2,2)Python numpy ValueError:无法将输入数组从形状(2,2,3)广播到形状(2,2)
【发布时间】:2021-06-20 23:42:45
【问题描述】:

我想压缩两个长度相同但包含不同维度矩阵的数组。

a1 = np.ones((2,2,3),dtype=np.uint8)
a2 = np.ones((2,2,3),dtype=np.uint8)*2
b1 = np.ones((2,2),dtype=np.uint8)
b2 = np.ones((2,2),dtype=np.uint8)*2

现在两个数组是c1,c2。

c1 = [a1,a2]
c2 = [b1,b2]

当我尝试像这样压缩它们时。

res = np.array(list(zip(c1,c2)))

我收到如下错误。

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 ValueError: 无法将输入数组从形状 (2,2,3) 广播到形状 (2,2)

为什么我会收到此错误? 我该如何解决?

【问题讨论】:

  • 您收到此错误是因为 a23D arraya1,b1,a22D array 所以数组 a2 的形状不同
  • @AnuragDabas 我该如何解决?我实际上想在之后随机化数组。
  • 你能给我们你的预期输出吗? res = ?
  • @RikardOlsson 为此我的预期输出将是 [(a1,b1),(a2,b2)]。
  • 正如 Anurag 所说,您不能创建具有不同形状的数组数组(尝试自己描述 res 的形状)。如果您尝试更详细地解释您的预期输出是什么以及您想用它做什么,那么帮助您会更容易

标签: python numpy


【解决方案1】:

c1c2列表,而不是数组。将它们组合起来会产生一个 2 元素的元组列表:

In [84]: C = list(zip(c1,c2))
In [85]: C
Out[85]: 
[(array([[[1, 1, 1],
          [1, 1, 1]],
  
         [[1, 1, 1],
          [1, 1, 1]]], dtype=uint8),
  array([[1, 1],
         [1, 1]], dtype=uint8)),
 (array([[[2, 2, 2],
          [2, 2, 2]],
  
         [[2, 2, 2],
          [2, 2, 2]]], dtype=uint8),
  array([[2, 2],
         [2, 2]], dtype=uint8))]

这是 (2,2,3) 和 (2,2) 形状数组的混合。有时,当尝试从混合形状数组创建数组时,我们会收到 ragged array 警告(从 numpy v1.19 开始)和 object dtype 数组。但是使用这种形状组合,结果是错误的。

解决该错误的一种方法是创建一个具有所需形状的对象 dtype 数组,并从列表中填充它:

In [93]: arr = np.empty((2,2), object)
In [94]: arr[:]=C
In [95]: arr
Out[95]: 
array([[array([[[1, 1, 1],
                [1, 1, 1]],

               [[1, 1, 1],
                [1, 1, 1]]], dtype=uint8), array([[1, 1],
                                                  [1, 1]], dtype=uint8)],
       [array([[[2, 2, 2],
                [2, 2, 2]],

               [[2, 2, 2],
                [2, 2, 2]]], dtype=uint8), array([[2, 2],
                                                  [2, 2]], dtype=uint8)]],
      dtype=object)

除了打印显示之外,与C 列表相比,该数组几乎没有优势。

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2018-06-30
    • 2018-06-08
    • 2020-01-21
    • 2020-10-18
    • 2018-09-25
    • 2018-04-21
    • 2020-10-09
    相关资源
    最近更新 更多