与您的第一句话相反,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)
我对@987654333@ 非常熟悉,但仍然需要反复试验才能弄清楚您想要什么。现在问题很清楚了,我可以用其他几种方式计算它
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.]])