NumPy 点积:取向量积的积(而不是求和)
NumPy dot product: take product of vector products (rather than sum)
假设我有两个矩阵: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
--
行
result = np.empty( (2,4) )
for i in range(2):
result[i,:] = np.prod(np.multiply(np.tile(M[i,:].T , (1,4)), C) , axis=0)
将其分解,M
的每一行都被转置,然后平铺(使用 np.tile
),因此它的大小与 C
相同(即 3x4)。然后我按元素乘以矩阵,并取每一列的乘积。
在我写的实际程序中,M
和C
不一定是整数,可以是任意大小,而且这个计算进行了数千次。我想知道是否有人知道一种快速且可读的方法。
更新
@Warren Weckesser 提供了一个很好的解决方案。但现在我遇到了新的挑战——具体来说,如果我想在向量乘积之前减去一个数字怎么办?
这可以像我之前的解决方案中那样完成:
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
是一个 matrix
实例,所以结果的形状是 (2, 1):
In [71]: M.prod(axis=1)
Out[71]:
matrix([[ 6],
[120]])
同样,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
参数来保持二维形状,并使用 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]])
假设我有两个矩阵: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
--
result = np.empty( (2,4) )
for i in range(2):
result[i,:] = np.prod(np.multiply(np.tile(M[i,:].T , (1,4)), C) , axis=0)
将其分解,M
的每一行都被转置,然后平铺(使用 np.tile
),因此它的大小与 C
相同(即 3x4)。然后我按元素乘以矩阵,并取每一列的乘积。
在我写的实际程序中,M
和C
不一定是整数,可以是任意大小,而且这个计算进行了数千次。我想知道是否有人知道一种快速且可读的方法。
更新
@Warren Weckesser 提供了一个很好的解决方案。但现在我遇到了新的挑战——具体来说,如果我想在向量乘积之前减去一个数字怎么办?
这可以像我之前的解决方案中那样完成:
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
是一个 matrix
实例,所以结果的形状是 (2, 1):
In [71]: M.prod(axis=1)
Out[71]:
matrix([[ 6],
[120]])
同样,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
参数来保持二维形状,并使用 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]])