numpy greenkey:操作数不能与形状一起广播

时间:2019-07-20 05:43:50

标签: python numpy valueerror

我正在尝试创建最简单的绿屏算法。我已经生成了形状为(1920,1080)并包含布尔值的“键”数组。仅使用foreground*key + background*inverted_key不起作用,因为前景和背景的形状是(1920,1080,3),因此会引发Value error: operands could not be broadcast together with shapes (1920,1080,3) (1920,1080)。那我该怎么做呢? 另外,我已经尝试过使用形状为(3,3,3)和(3,3)的数组进行此操作-而且效果很好。请解释发生了什么,我很困惑。

1 个答案:

答案 0 :(得分:1)

Python广播规则非常简单:

  1. 将前导1添加到维数较少的数组形状中
  2. 按比例放大所有1以匹配其他数组中的尺寸
  3. 在前两个步骤之后,所有尺寸都必须匹配

因此,当您乘以(3,3,3)和(3,3)时,首先将第二个数组再扩展一个维度(1,3,3),然后按比例缩放所有1以匹配您所乘的(3,3,3)到底是(3,3,3)。 当您将(1920,1000,3)乘以(1920,1000)时,第二个数组扩展为(1,1920,1000),然后将1放大,因此最终您尝试乘以(1920,1000,3) )加上(1920,1920,1000),因此出现错误。

您可以执行以下操作:

key3dim = np.tile(key.reshape(key.shape[0], key.shape[1], 1), 3)
# or
key3dim = np.repeat(key.reshape(key.shape[0], key.shape[1], 1), 3, 2)
# or
key3dim = key.reshape(key.shape[0], key.shape[1], 1).repeat(3, 2)
foreground*key3dim + background*~key3dim

examples of broadcasting here