import numpy
a = numpy.arange(9).reshape(3,3)
b = numpy.arange(60).reshape(20,3)
c1 = numpy.dot(b, a.T) # as in the answer of senderle
c2 = numpy.einsum('ji,ki->kj',a,b)
并且生成的 c1 和 c2 都与您希望的相同(使用您的 验证c[i] = np.dot(a, b[i])
)
的优点numpy.einsum
是这个技巧'ji,ki->kj'
告诉在什么维度上必须做什么也适用于更大的维度。
关于 einsum 的更多解释
例如,如果要执行以下操作:
a = numpy.arange(60.).reshape(3,4,5)
b = numpy.arange(24.).reshape(4,3,2)
d1 = numpy.zeros((5,2))
for i in range(5):
for j in range(2):
for k in range(3):
for n in range(4):
d1[i,j] += a[k,n,i] * b[n,k,j]
您可以通过以下方式更快地完成相同的操作:
d2 = numpy.einsum('kni,nkj->ij', a, b)
# the 'kni,nkj->ij' is what you otherwise do with the indices as in
# d1[i,j] += a[k,n,i] * b[n,k,j]
或者如果您不喜欢这种指定必须发生的事情的方式,您也可以使用 numpy.tensordot
代替numpy.einsum
,并按如下方式指定轴:
d3 = numpy.tensordot(a,b, axes=([1,0],[0,1]))
所以这个 einsum 方法非常通用,可用于缩短 for 循环(否则会很慢,如果你在 python 中执行它们),并且对于时髦的张量材料非常有趣
有关更多信息,请参阅http://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html和http://docs.scipy.org/doc/numpy/reference/generated/numpy.einsum .html