Numpy greenkey:操作数无法与形状一起广播

Numpy greenkey : operands could not be broadcast together with shapes

我正在尝试创建最简单的绿屏算法。我已经生成了形状为 (1920,1080) 并包含布尔值的 "key" 数组。仅仅使用 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) 的数组 - 它工作得很好。请解释发生了什么,我很困惑。

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 ) by (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