繁体   English   中英

使用numpy自定义矩阵乘法

[英]custom matrix multiplication with numpy

我想要一个奇怪的点积用于numpy中的矩阵乘法。 对于线[1,2,3]矩阵的A和列[4,5,6]为基质B ,我想使用的“产品” min(1+4, 2+5, 3+6)用于获得矩阵积AB

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]])

您可以使用循环和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]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM