使用 numpy 自定义矩阵乘法

custom matrix multiplication with numpy

我想要一个奇怪的点积用于 numpy 中的矩阵乘法。 对于矩阵 A 的行 [1,2,3] 和矩阵 B 的列 [4,5,6],我希望使用 "product" min(1+4, 2+5, 3+6) 来获取矩阵产品 AB.

您可以使用循环和 numpy 构建自己的自定义乘法函数,如下所示:

import numpy as np

x = np.array([[1, 2, 3], 
              [4 ,5, 6], 
              [7 ,8, 9]])

y = np.array([[4, 0, 6], 
              [5, 7, 3], 
              [6, 5, 9]])

def custom_multiply(x, y):
    return np.array([min(row*column) for row in x for column in y.T]).reshape(x.shape[0], y.shape[1])

print(custom_multiply(x, y))

输出:

[[ 4  0  6]
 [16  0 15]
 [28  0 24]]
In [498]: A = np.arange(12).reshape(4,3)                                             
In [499]: B = np.arange(4,10).reshape(3,2)                                           
In [500]: A                                                                          
Out[500]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
In [501]: B                                                                          
Out[501]: 
array([[4, 5],
       [6, 7],
       [8, 9]])

参考迭代方案:

In [504]: res = np.zeros((A.shape[0],B.shape[1]), A.dtype) 
     ...: for i,row in enumerate(A): 
     ...:     for j,col in enumerate(B.T): 
     ...:         res[i,j] = np.min(row+col) 
     ...:                                                                            
In [505]: res                                                                        
Out[505]: 
array([[ 4,  5],
       [ 7,  8],
       [10, 11],
       [13, 14]])

使用广播的更快版本:

In [506]: np.min(A[:,:,None]+B[None,:,:], axis=1)                                    
Out[506]: 
array([[ 4,  5],
       [ 7,  8],
       [10, 11],
       [13, 14]])

===

证明矩阵乘积的等价性:

In [507]: np.dot(A,B)                                                                
Out[507]: 
array([[ 22,  25],
       [ 76,  88],
       [130, 151],
       [184, 214]])
In [508]: np.sum(A[:,:,None]*B[None,:,:], axis=1)                                    
Out[508]: 
array([[ 22,  25],
       [ 76,  88],
       [130, 151],
       [184, 214]])