np.dot(a, b)
over the last axis of a and the second-to-last of 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
太多,除非它是明显的矩阵或向量乘法,因为它使用可选out
参数时是非常严格的输出D型。 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
我发现numpy的tensordot轴完全混乱。你能详细说明吗?我想通过一个(3,5)张量来多重(10,3,2)张量来得到一个(2)张量。 – Bob 2015-12-22 22:31:15