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