【问题标题】:Numpy - multiple 3d array with a 2d arrayNumpy - 带有 2d 数组的多个 3d 数组
【发布时间】:2018-04-06 09:59:35
【问题描述】:

我正在尝试以下方法:

给定一个矩阵 A (x, y ,3) 和另一个矩阵 B (3, 3),我想返回一个 (x, y, 3) 矩阵,其中 A 的第三维乘以值的 B (类似于将 RGB 图像转换为灰色,只是那些“RGB”值乘以矩阵而不是标量)...

这是我尝试过的:

np.multiply(B, A)
np.einsum('ijk,jl->ilk', B, A)
np.einsum('ijk,jl->ilk', A, B)

所有这些都因尺寸未对齐而失败。

我错过了什么?

【问题讨论】:

  • B 的哪个轴是sum-reduced
  • 我正在尝试做 B * A,其中 A 的第 3 轴发生了变化
  • 那么,B 的最后一个轴减少了吗?
  • 是的............

标签: python numpy matrix


【解决方案1】:

你可以使用np.tensordot -

np.tensordot(A,B,axes=((2),(1)))

Related post to understand tensordot.

einsum 相当于 -

np.einsum('ijk,lk->ijl', A, B)

我们也可以使用A.dot(B.T),但这会在后台循环。所以,可能不是最喜欢的,但它是一个紧凑的解决方案,

【讨论】:

  • 这些功能没有错误! :)) 但由于某种原因我得到了错误的值...我的意思是当我尝试使用新值显示图像时出现错误
  • @DanielY 也许你的意思是sum-reduce B 的第一个轴?然后,使用:np.tensordot(A,B,axes=((2),(0)))?
  • @DanielY 另外,请确保您没有溢出并使用 uint8 dtype 进行图像显示。
  • 我得到了很多负值...我认为我的 B 错误或颠倒...我会检查一下。谢谢
  • 在尝试 tensordot() 函数时,我得到的结果矩阵为 (3, x, y) 而不是 (x, y, 3)
【解决方案2】:

对不起,我认为您可以使用简单的 numpy 方法来做这样的事情:

首先,您可以重塑 A,使其纤维(或深度向量 A[:,:,i])将作为列放置在矩阵 C 中:

C = A.reshape(x*y,3).T

然后使用简单的矩阵乘法即可:

D = numpy.dot(B,C)

最后把结果恢复到原来的尺寸:

D.T.reshape([x,y,3])

【讨论】:

  • 我正在尝试做 B * A,我已经尝试了您的建议,但操作数无法与形状 (3,3) (x, y, 3) 一起广播
  • 上面刚告诉你,强制B有形状(3,3,1)!
  • 对不起,我的意思是错误操作数不能和形状一起广播 (3,3, 1) (x, y, 3)
  • 好吧,我想我明白你的意思了,但是 x 或 y 必须有维度 3 不是吗?
  • 您更新的评论确实让我得到了预期的结果,但@Divakar 的回答也是如此,非常感谢,但我得到了我需要的东西:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2015-11-14
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多