【问题标题】:How do I broadcast other dimensions using numpy.matmul?如何使用 numpy.matmul 广播其他维度?
【发布时间】:2021-01-19 19:57:34
【问题描述】:

我有一个 640x480 RGB 图像,形状为 numpy (480, 640, 3) -- R、G、B 通道为 3 我想在每个像素,按照以下方式转换RGB值:

    # for each pixel
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            # set the new RGB value at that pixel to
            # (new RGB vector) = (const matrix A) * (old RGB vector) + (const vector B)
            img[i,j,:] = np.reshape((np.matmul(A, np.expand_dims(img[i,j,:], axis = 1)) + B), (3,))

其中 A 的形状为 (3,3),B 的形状为 (3,1)。 如何使用 numpy 执行此操作而不在像素上编写循环?

【问题讨论】:

  • 您的代码不起作用。 numpy.matmul(A, data[i,j,:].T) + B 返回形状 (3,3) 而 img[i,j,:] 具有形状 (3,)。您将形状(3,3) 分配给(3,)
  • @wuxiekeji 好像是错字 - B 必须是 1D 数组?
  • 我以我认为可行的方式对其进行了编辑,但无论哪种方式,目的都是在每个 rgb 像素处执行 (constant matrix A)*(rgb vector) + (constant vector B)。
  • @wuxiekeji 发布的解决方案对您有用吗?

标签: python python-3.x numpy math matrix


【解决方案1】:

一种方法是使用np.einsum -

img = np.einsum('ij,klj->kli',A,data) + B

另一个np.tensordot -

img = np.tensordot(data,A,axes=(-1,-1)) + B

相关 - Understanding tensordot

我假设 B1D 数组。如果不是,请使用B.ravel() 代替B

【讨论】:

  • data@A.T+B 应该和你的 einsum 表达式一样。
猜你喜欢
  • 2018-03-13
  • 2023-01-13
  • 2017-10-13
  • 2020-01-25
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多