使用矩阵Multipy每行numpy数组

时间:2018-02-19 01:54:13

标签: python numpy

将np数组的每一行(轴= 2)与矩阵相乘的最pythonic方法是什么。例如,我正在使用读取为np数组形状(480,512,3)的图像,我想将每个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(暗淡1)!= 512(暗淡1)

1 个答案:

答案 0 :(得分:1)

所以A是(3,3)而x是(480,512,3),而你在尺寸3维度上是dot。使用dot(A,B)时要记住的关键是,A的最后一个D是第二个到最后一个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个。形状保持不变。你想要转置吗?