np.dot(a, b)
在a 的最后一个轴和 b 的倒数第二个轴上运行。因此,对于您问题中的特定情况,您可以随时选择:
>>> a.dot(v)
array([[ 3., 3., 3.],
[ 3., 3., 3.],
[ 3., 3., 3.]])
如果要保持v.dot(a)
顺序,则需要使轴就位,这可以通过以下方式轻松实现np.rollaxis
:
>>> v.dot(np.rollaxis(a, 2, 1))
array([[ 3., 3., 3.],
[ 3., 3., 3.],
[ 3., 3., 3.]])
我不太喜欢,除非是为了明显的矩阵或向量乘法,因为在使用可选参数np.dot
时对输出dtype非常严格。out
Joe Kington 已经提到过它,但如果你要做这类事情,请习惯np.einsum
:一旦你掌握了语法,它就会将你花在重塑事物上的时间减少到最低限度:
>>> a = np.ones((3, 3, 2))
>>> np.einsum('i, jki', v, a)
array([[ 3., 3., 3.],
[ 3., 3., 3.],
[ 3., 3., 3.]])
并不是说它在这种情况下太相关,但它也快得离谱:
In [4]: %timeit a.dot(v)
100000 loops, best of 3: 2.43 us per loop
In [5]: %timeit v.dot(np.rollaxis(a, 2, 1))
100000 loops, best of 3: 4.49 us per loop
In [7]: %timeit np.tensordot(v, a, axes=(0, 2))
100000 loops, best of 3: 14.9 us per loop
In [8]: %timeit np.einsum('i, jki', v, a)
100000 loops, best of 3: 2.91 us per loop