np.dot(a, b)
a の最後の軸と b の最後から 2 番目の軸を操作します。したがって、質問の特定のケースでは、いつでも次のようにすることができます:
>>> 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
ジョー・キングトンはすでにそれについて言及しましたが、この種のことを行う場合は、慣れて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