将2D numpy数组与2D numpy数组的每一行相乘不使用for循环

问题描述

我有两个2D numpy数组,如下所示

Matrix_A是形状为(3,3)的2D数组 Matrix_B是shape(9,3)的2D数组

Matrix A = [[ 0. -1.  0.]
            [ 1.  0.  0.]
            [ 0.  0.  1.]]


Matrix_B = [[0.5 0.5 0.5]
            [1.5 0.5 0.5]
            [2.5 0.5 0.5]
            [0.5 1.5 0.5]
            [1.5 1.5 0.5]
            [2.5 1.5 0.5]
            [0.5 2.5 0.5]
            [1.5 2.5 0.5]
            [2.5 2.5 0.5]]

Matrix_C = Matrix multiply A and B (preferably numpy dot)  # Need the shape of the matrix to be (9,3)
print(Matrix_C)

对于上述情况,Matrix_C的答案将为

Matrix_C = [[-0.5  0.5  0.5]
            [-0.5  1.5  0.5]
            [-0.5  2.5  0.5]
            [-1.5  0.5  0.5]
            [-1.5  1.5  0.5]
            [-1.5  2.5  0.5]
            [-2.5  0.5  0.5]
            [-2.5  1.5  0.5]
            [-2.5  2.5  0.5]]

上面的Matrix_C值是使用for循环获得的

Matrix_C = np.zeros_like(len(Matrix_B))

for i in range(len(Matrix_B)):
    Matrix_C[i] = np.dot(Matrix_A,Matrix_B[i])


print(Matrix_C)

我希望将Matrix_A与Matrix_B的每一行相乘。

不使用For循环。通过引入numpy newaxis和numpy广播方法,可以实现我使用for_loop获得的Matrix_C的值。

期待一些答复。

解决方法

让我们尝试一下代码:

Matrix_A = np.concatenate((Matrix_A,Matrix_A,Matrix_A),axis=0)
Matrix_C = Matrix_A * Matrix_B
,

好吧,所以从您添加的说明中开始,需要对MatrixB的每一行执行Matrix A * Matrix B [0],...,Matrix A * Matrix B [n]。 请记住,在将矩阵相乘时,相乘的顺序很重要。

从本质上讲,这等效于(矩阵A *(矩阵B)^ T)^ T(^ T表示矩阵的转置)。在numpy代码中,假设矩阵是numpy数组,就可以像这样完成

matrixC = MatrixA.dot(MatrixB.T).T