相反,你的第一句話,a
和b
是不一樣的尺寸。但讓我們專注於你的例子。
所以,你想這一點 - 2級的產品,一個爲a
每一行和b
np.array([np.dot(x,y) for x,y in zip(a,b)])
或避免附加
X = np.zeros((2,2))
for i in range(2):
X[i,...] = np.dot(a[i],b[i])
的dot
產品可與einsum
(矩陣指數來表示符號)如
[np.einsum('ij,j->i',x,y) for x,y in zip(a,b)]
所以下一步就是那個第一個維度指數:
np.einsum('kij,kj->ki',a,b)
我很熟悉einsum
,但它仍然採取了一些試驗和錯誤要弄清楚你想要什麼。現在問題很清楚,我可以用其他幾種方法計算它
A, B = np.array(a), np.array(b)
np.multiply(A,B[:,np.newaxis,:]).sum(axis=2)
(A*B[:,None,:]).sum(2)
np.dot(A,B.T)[0,...]
np.tensordot(b,a,(-1,-1))[:,0,:]
我發現使用具有不同大小的數組很有幫助。例如,如果A
是(2,3,4)
和B
(2,4)
,則點總和必須位於最後一個維上。
另一個numpy迭代工具是np.nditer
。 einsum
使用此(在C中)。 http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html
it = np.nditer([A, B, None],flags=['external_loop'],
op_axes=[[0,1,2], [0,-1,1], None])
for x,y,w in it:
# x, y are shape (2,)
w[...] = np.dot(x,y)
it.operands[2][...,0]
避免[...,0]
一步,需要更復雜的設置。
C = np.zeros((2,2))
it = np.nditer([A, B, C],flags=['external_loop','reduce_ok'],
op_axes=[[0,1,2], [0,-1,1], [0,1,-1]],
op_flags=[['readonly'],['readonly'],['readwrite']])
for x,y,w in it:
w[...] = np.dot(x,y)
# w[...] += x*y
print C
# array([[ 7., 15.],[ 14., 32.]])
HTTP:// WWW。 python-course.eu/matrix_arithmetic.php – lucemia
@lucemia,我在那裏找不到任何相關的東西。 – Cupitor