1. np.dot(vector1*matrix1)
2. np.array([np.dot(row,vector1) for row in matrix1])
3. np.matmul(vector1,matrix1)
4. np.dot(matrix1,vector1)
5. np.sum(matrix1*vector1,axis=1)
答案 0 :(得分:5)
首先,我们可以询问哪个工作!
In [4]: vector1 = np.arange(10)
In [5]: matrix1 = np.arange(50).reshape(5,10)
首先错误地使用dot
:
In [6]: np.dot(vector1*matrix1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-c0ee48ce8d26> in <module>()
----> 1 np.dot(vector1*matrix1)
TypeError: Required argument 'b' (pos 2) not found
下一个有效的
In [7]: np.array([np.dot(row,vector1) for row in matrix1])
Out[7]: array([ 285, 735, 1185, 1635, 2085])
另一种错误的方式-与matmul
一样,使用dot
的基本规则是'a的最后一个,b的第二个到b的最后一个':
In [8]: np.matmul(vector1,matrix1)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-8-90d753017fdf> in <module>()
----> 1 np.matmul(vector1,matrix1)
ValueError: shapes (10,) and (5,10) not aligned: 10 (dim 0) != 5 (dim 0)
使用dot
(正确的(5,10)对和正确的(10,)的正确方法):
In [9]: np.dot(matrix1,vector1)
Out[9]: array([ 285, 735, 1185, 1635, 2085])
和另一种正确的方法。
In [10]: np.sum(matrix1*vector1,axis=1)
Out[10]: array([ 285, 735, 1185, 1635, 2085])
起作用的结果相同。
[9]中的顺序也适用于matmul
。也可以将其写为matrix1 @ vector1
。
至于“最佳”,我们可以尝试计时。我的猜测是[9]最快,[7]最快。
将(5,10)与(10,)配对的情况是(5,10)与(10,n)配对以产生(5,n)的规范2d情况的一般化。
答案 1 :(得分:0)
import numpy as np
v = np.random.random(size = 10) # vector of size 10
m = np.random.random(size = (5, 10)) # matrix of size (5, 10)
m@v # compute inner product
我们只使用内部乘积运算符@
。例如,
>>> v
array([ 0.62106289, 0.53194633, 0.26856774, 0.97947622, 0.38479922,
0.03201307, 0.51045447, 0.49990235, 0.54168934, 0.50868176])
>>> m
array([[ 0.13075822, 0.68711111, 0.15934606, 0.44172015, 0.22615204,
0.44816934, 0.53960113, 0.80397538, 0.50143107, 0.18997813],
[ 0.78891921, 0.035147 , 0.40099655, 0.33270442, 0.42478057,
0.4145495 , 0.84061422, 0.36837421, 0.62218952, 0.34043758],
[ 0.96878536, 0.74850168, 0.52667831, 0.87088367, 0.28361016,
0.4861426 , 0.30693948, 0.81342318, 0.66667058, 0.32418454],
[ 0.44617067, 0.87359669, 0.91079363, 0.70184155, 0.65774634,
0.83738866, 0.29639453, 0.20157455, 0.08307142, 0.46592851],
[ 0.85389639, 0.59084659, 0.76528861, 0.70007616, 0.23339048,
0.49946522, 0.35635152, 0.38155495, 0.46604566, 0.00703169]])
>>> m@v
array([ 2.06914458, 2.24241604, 3.20833979, 2.48783289, 2.47033001])
在这种情况下,m[i]@v = (m@v)[i]
为i=0,1,2,3,4
。
>>> np.alltrue([(m@v)[i]==m[i]@v for i in range(m.shape[0])])
True
另一种解决方案使用np.einsum
。更容易理解您过去曾经使用过爱因斯坦的求和表示法(例如来自微分几何或更高级的物理学)
>>> np.einsum('ij,j',m,v)
array([ 2.06914458, 2.24241604, 3.20833979, 2.48783289, 2.47033001])