In [758]: v = np.array([[1, 2, 3, 4]])
In [759]: v2 = np.vstack([v,v])
In [760]: v2.shape
Out[760]: (2, 4)
In [761]: v2[:,None,:]*v2[:,:,None]
Out[761]:
array([[[ 1, 2, 3, 4],
[ 2, 4, 6, 8],
[ 3, 6, 9, 12],
[ 4, 8, 12, 16]],
[[ 1, 2, 3, 4],
[ 2, 4, 6, 8],
[ 3, 6, 9, 12],
[ 4, 8, 12, 16]]])
In [762]: _.shape
Out[762]: (2, 4, 4)
我使用廣播來構造外部產品。
覈對您的評論例如
In [763]: x2= np.array([[1, 2], [1, 2]])
In [764]: x2[:,None,:]*x2[:,:,None]
Out[764]:
array([[[1, 2],
[2, 4]],
[[1, 2],
[2, 4]]])
你想:
In [765]: np.array([[[1, 2], [2, 4]],[[4, 2],[2, 1]]])
Out[765]:
array([[[1, 2],
[2, 4]],
[[4, 2],
[2, 1]]])
的數字是有,但第二面翻轉。那真的是你想要的嗎?顯然,維度映射的方式有些不明確。如果這真的是你想要的,請解釋你將如何迭代。
einsum
隨着該外產物是
In [770]: np.einsum('ij,ik->ijk', x2,x2)
Out[770]:
array([[[1, 2],
[2, 4]],
[[1, 2],
[2, 4]]])
隨着matmul
表達式爲:v2[:,:,None]@v2[:,None,:]
。
你可以舉一個'[[1,2],[1,2]]'輸出結果的例子嗎? –
array([[[1,2],[2,4]],[[4,2],[2,1]])) –
'np.einsum'和'np.matmul'可以處理這個問題。其實這是外部產品,所以你不需要這些。廣播可以處理它。 – hpaulj