你好堆疊溢位,
我能夠通過回圈獲得所需的結果,但想知道如何在二維陣列的每行應用一個點積。我試圖從 A 中取出每一行,并用 B 應用一系列點積。現在我的中間結果有點不穩定,但我確實得到了我想要的結果。希望矢量化和消除回圈。
A = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
B = np.array([[9,-1,8],[-12,20,-5],[6,1,4]])
int_result = np.ones((len(A),3))
for r in np.arange(0,len(A)):
int_result[r] = A[r].T.dot(B).dot(A[r])
print(int_result)
desired_result = int_result[:,0]
print(desired_result)
中間結果
[[ 117. 117. 117.]
[ 744. 744. 744.]
[1911. 1911. 1911.]
[3618. 3618. 3618.]]
期望的結果
[ 117. 744. 1911. 3618.]
uj5u.com熱心網友回復:
這是 2 次np.matmul乘法,使用 的第一個維度A作為batch維度:
In [55]: A = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
...: B = np.array([[9,-1,8],[-12,20,-5],[6,1,4]])
In [56]: A
Out[56]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
In [57]: B
Out[57]:
array([[ 9, -1, 8],
[-12, 20, -5],
[ 6, 1, 4]])
In [58]: A.shape
Out[58]: (4, 3)
In [59]: B.shape
Out[59]: (3, 3)
添加維度A使其成為 (4,1,3) 和 (4,3,1),我們可以這樣做:
In [60]: (A[:,None,:]@B@A[:,:,None]).shape
Out[60]: (4, 1, 1)
并洗掉尺寸 1 尺寸:
In [61]: (A[:,None,:]@B@A[:,:,None]).squeeze()
Out[61]: array([ 117, 744, 1911, 3618])
等價的einsum也同樣好:
In [62]: np.einsum('ij,kj,ik->i',A,B,A)
Out[62]: array([ 117, 744, 1911, 3618])
在你的回圈中:
In [65]: r=3; A[r]@B@A[r] # A[r] is 1d, so T isn't needed
Out[65]: 3618
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/453076.html
上一篇:Numpy,熊貓合并行
