【问题标题】:Multipy each row of numpy array with matrix将numpy数组的每一行与矩阵相乘
【发布时间】:2018-02-19 01:54:12
【问题描述】:

将 np 数组的每一行(axis=2)与矩阵相乘的最 Pythonic 方法是什么。例如,我正在处理读取为形状为 (480, 512, 3) 的 np 数组的图像,我想将每个 img[i,j] 与 3x3 矩阵相乘。我不想为此使用 for 循环。这是我尝试过的,但它给出了一个错误

A = np.array([
        [.412453, .35758, .180423],
        [.212671, .71516, .072169],
        [.019334, .119193, .950227]
    ])
lin_XYZ = lambda x: np.dot(A, x[::-1])
#lin_XYZ = np.vectorize(lin_XYZ)
tmp_img = lin_XYZ(tmp_img[:,:])

File ".\proj1a.py", line 24, in color2luv
tmp_img = lin_XYZ(tmp_img[:,:])
File ".\proj1a.py", line 22, in <lambda>
lin_XYZ = lambda x: np.dot(A, x)

ValueError:形状 (3,3) 和 (480,512,3) 未对齐:3 (dim 1) != 512 (dim 1)

【问题讨论】:

  • “行”实际上是指轴 = 2 还是轴 = 1? (因为第一个轴,列轴,将是axis = 0?)
  • 看起来你想要的只是x.dot(A) 而不是A.dot(x)
  • 你可以重塑你的矩阵,比如说,从 MxNx3 到 Ox3,O = M*N,然后将它相乘,然后再次重塑它。
  • @AGNGazer,请参考:stackoverflow.com/help/be-nice
  • @AGNGazer 抱歉,我下次会尝试改进,但我不想将 (480,512) 乘以 3x3,我的意思是每个 img[i,j] 都会给出一行包含 3 个元素的行,然后将它与3x3 矩阵相乘,下次@heltonbiker 我会尝试更好地描述问题

标签: python numpy


【解决方案1】:

所以A 是 (3,3) 和 x 是 (480, 512, 3),而你在大小 3 维度上是什么 dotdot(A,B) 要记住的关键是,A 的最后一个暗淡与 B 的第二个到最后一个暗淡。(这就是错误抱怨 3 (dim 1) != 512 (dim 1) 的原因)

x.dot(A)
x.dot(A.T)

会满足这个要求。

A.dot(x.transpose(0,2,1))   #  (3,3) with (480,3,512) 

也可以,但结果数组可能需要进一步转置 - 假设您希望 3 排在最后。

您还可以将维度与einsumtensordot 配对:

np.einsum('ij,kli->klj', A, x)

x[::-1] 在其第一个维度上翻转 x,即 480 维度。形状保持不变。你想要转置吗?

【讨论】:

  • 谢谢。我正在使用 opencv 读取图像,在 (480,512,3) 中,3 代表色带 - R、G、B 但 opencv 将其读取为 BGR,我需要将其作为 RGB,所以我认为使用 x[::-1] 可以做到这一点。
  • 如果您需要交换色带,那么::-1 是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2019-11-15
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多