我有一個 3D numpy 陣列,我想將它與 2D 陣列相乘,3D 如下所示:
C= np.zeros((3, 2, 2))
C[0][0] = [0,0]
C[0][1] = [0,1]
C[1][0] = [1,0]
C[1][1] = [1,1]
C[2][0] = [1,2]
C[2][1] = [2,1]
二維陣列如下所示:
V = np.zeros((3,2))
V[0][0] = 1
V[0][1] = 2
V[1][0] = 1
V[1][1] = 3
V[2][0] = 4
V[2][1] = 5
結果R是一個 2X2 2D 陣列(總共 4 個元素)R=[[5,8],[13,10]],其中:
R[0] = V[0][0]*C[0][0] V[1][0]*C[1][0] V[2][0]*C[2][0] = [5,8] (first row of R)
R[1] = V[0][1]*C[0][1] V[1][1]*C[1][1] V[2][1]*C[2][1] = [13,10] (second row of R)
這只是一個示例,我如何使用帶有and的Rnumpy 矩陣乘法運算(沒有 for 回圈!)。請幫忙!VC
抱歉,我稍后做了一些編輯,評論顯示了一個舊示例,現在應該很好
uj5u.com熱心網友回復:
你的例子令人困惑。為什么你說你的預期結果是[[1, 0], [5, 10]],但在你的例子中你也說R應該是[[5, 8], [13, 10]]?
我希望這只是您的一個錯字,因為從您的示例中不清楚您將如何從一個到另一個。
在任何情況下:
(V.T * C.T).sum(axis=2).T
輸出:
array([[ 5., 8.],
[13., 10.]])
uj5u.com熱心網友回復:
In [20]: C # (3,2,2)
Out[20]:
array([[[0, 0],
[0, 1]],
[[1, 0],
[1, 1]],
[[1, 2],
[2, 1]]])
In [21]: V # (3,2)
Out[21]:
array([[1., 2.],
[1., 3.],
[4., 5.]])
展開V為 (3,2,1)。這broadcasts會C產生 (3,2,2):
In [22]: C * V[:,:,None]
Out[22]:
array([[[ 0., 0.],
[ 0., 2.]],
[[ 1., 0.],
[ 3., 3.]],
[[ 4., 8.],
[10., 5.]]])
并在第一個軸上求和以產生 (2,2) 結果:
In [23]: (C * V[:,:,None]).sum(axis=0)
Out[23]:
array([[ 5., 8.],
[13., 10.]])
這個答案清理了@ddjohns 的答案;他做了艱苦的作業。
乘積之和可以表示einsum為:
In [24]: np.einsum('ijk,ij->jk',C,V)
Out[24]:
array([[ 5., 8.],
[13., 10.]])
對軸重新排序,我們可以將其表示為更傳統的乘積和:
In [25]: np.einsum('jki,ji->jk',C.transpose(1,2,0),V.transpose(1,0))
Out[25]:
array([[ 5., 8.],
[13., 10.]])
并使用它將其轉換為matmul:
In [28]: (C.transpose(1,2,0)@V.transpose(1,0)[:,:,None]).squeeze(2)
Out[28]:
array([[ 5., 8.],
[13., 10.]])
[28] 可能是最快的,但 [23] 可能更容易理解。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/448648.html
上一篇:numpy矩陣逆輸入
