Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NumPy点积:取向量积的乘积(而不是求和)_Python_Numpy_Matrix_Matrix Multiplication - Fatal编程技术网

Python NumPy点积:取向量积的乘积(而不是求和)

Python NumPy点积:取向量积的乘积(而不是求和),python,numpy,matrix,matrix-multiplication,Python,Numpy,Matrix,Matrix Multiplication,假设我有两个矩阵:M是2x3,C是3x4 import numpy as np M = np.matrix([ [1,2,3], [4,5,6]]) C = np.matrix([ [1,1,2,2], [1,2,1,2], [2,1,1,1]]) 我需要将这些矩阵相乘,得到大小为2x4的结果。这对于np.dot(M,C)来说很容易,但是我想将向量积相乘,而不是求和 例如,常规点积可以: result[0,0] = (M[0,0]*C[0,0]) + (M[0,1]*C[1,0]) + (M[

假设我有两个矩阵:
M
是2x3,
C
是3x4

import numpy as np
M = np.matrix([ [1,2,3], [4,5,6]])
C = np.matrix([ [1,1,2,2], [1,2,1,2], [2,1,1,1]])
我需要将这些矩阵相乘,得到大小为2x4的结果。这对于np.dot(M,C)来说很容易,但是我想将向量积相乘,而不是求和

例如,常规点积可以:

result[0,0] = (M[0,0]*C[0,0]) + (M[0,1]*C[1,0]) + (M[0,2]*C[2,0])
# result[0,0] = (1*1) + (2*1) + (3*2)
# result[0,0] = 9
我只是想用乘法符号代替加号

result[0,0] = (M[0,0]*C[0,0]) * (M[0,1]*C[1,0]) * (M[0,2]*C[2,0])
# result[0,0] = (1*1) * (2*1) * (3*2)
# result[0,0] = 12
我的最佳解决方案依赖于在
M
--

分解后,
M
的每一行被转置,然后平铺(使用
np.tile
),因此它的大小与
C
(即3x4)相同。然后我将矩阵按元素相乘,并取每列的乘积

在我正在编写的实际程序中,
m
C
不一定是整数,可以是任何大小,并且这个计算要执行数千次。我想知道是否有人知道一种快速易读的方法

更新 @沃伦·韦克瑟提供了一个很好的解决方案。但现在我有了一个新的挑战——特别是,如果我想在向量乘积相乘之前从向量乘积中减去一个数字,会怎么样

在我以前的解决方案中,可以这样做:

result1 = np.empty( (2,4) ) 
for i in range(2): 
    result1[i,:] = np.prod( 1 - np.multiply( np.tile(M[i,:].T , (1,4)), C) , axis=0)
我一直在玩弄@Warren Weckesser提供的解决方案,但毫无用处。我很想找到更优雅的东西

这里有一个快速方法:

In [68]: M
Out[68]: 
matrix([[1, 2, 3],
        [4, 5, 6]])

In [69]: C
Out[69]: 
matrix([[1, 1, 2, 2],
        [1, 2, 1, 2],
        [2, 1, 1, 1]])

In [70]: M.prod(axis=1) * C.prod(axis=0)
Out[70]: 
matrix([[ 12,  12,  12,  24],
        [240, 240, 240, 480]])
M.prod(axis=1)
M
行中元素的乘积。因为
M
是一个
矩阵
实例,所以结果的形状是(2,1):

类似地,
C.prod(axis=0)
C
列下的产品:

In [72]: C.prod(axis=0)
Out[72]: matrix([[2, 2, 2, 4]])
然后这两个矩阵的矩阵积,具有形状(2,1)和(1,4),具有形状(2,4),它包含您想要的积

对于数组,使用
prod()
keepdims
参数来维护2D形状,并使用
dot()
方法而不是
*

In [79]: m = M.A

In [80]: c = C.A

In [81]: m
Out[81]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [82]: c
Out[82]: 
array([[1, 1, 2, 2],
       [1, 2, 1, 2],
       [2, 1, 1, 1]])

In [83]: m.prod(axis=1, keepdims=True).dot(c.prod(axis=0, keepdims=True))
Out[83]: 
array([[ 12,  12,  12,  24],
       [240, 240, 240, 480]])

这太棒了!谢谢如果我想在向量积相乘之前从向量积中减去一些东西,你有什么建议吗?i、 对于范围(2)中的i,结果=np.empty((2,4)):结果[i,:]=np.prod(1-np.multiply(np.tile(M[i,:].T,(1,4)),C),轴=0)
In [72]: C.prod(axis=0)
Out[72]: matrix([[2, 2, 2, 4]])
In [79]: m = M.A

In [80]: c = C.A

In [81]: m
Out[81]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [82]: c
Out[82]: 
array([[1, 1, 2, 2],
       [1, 2, 1, 2],
       [2, 1, 1, 1]])

In [83]: m.prod(axis=1, keepdims=True).dot(c.prod(axis=0, keepdims=True))
Out[83]: 
array([[ 12,  12,  12,  24],
       [240, 240, 240, 480]])