<pre><code>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
</code></pre>
<p>我们只使用内积运算符<code>@</code>。举个例子</p>
<pre><code>>>> 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])
</code></pre>
<p>在本例中,<code>m[i]@v = (m@v)[i]</code>表示<code>i=0,1,2,3,4</code>。</p>
<pre><code>>>> np.alltrue([(m@v)[i]==m[i]@v for i in range(m.shape[0])])
True
</code></pre>
<p>另一种解决方案使用<code>np.einsum</code>。更容易理解的是,你过去使用过爱因斯坦的求和符号(比如微分几何或更高级的物理学)</p>
<pre><code>>>> np.einsum('ij,j',m,v)
array([ 2.06914458, 2.24241604, 3.20833979, 2.48783289, 2.47033001])
</code></pre>