我有一个3x3的矩阵,我想用这个矩阵将列表中的每个向量相乘。
这可以轻松地通过循环来完成:
import numpy as np
a = np.array([[0,1,0],[-1,0,0],[0,0,1]])
b = np.array([[1,2,3],[4,5,6]])
for elem in b:
print(a.dot(elem))
为了更快起见,我尝试使用numpy.einsum,但我无法正确制定公式。
我尝试了np.einsum('ij,ji->ij', a, b)
,但这导致了ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (3,3)->(3,3) (2,3)->(3,2)
有什么建议吗?
答案 0 :(得分:2)
In [489]: for elem in b:
...: print(a.dot(elem))
...:
[ 2 -1 3]
[ 5 -4 6]
第一步-您正在迭代b
的第一个维度,并期望在结果中也是如此:
np.einsum(',i->i', a, b)
dot
将a
的最后一个暗度与elem的唯一暗度,b
的第二个暗度配对-并将它们相加:
np.einsum(' j,ij->i', a, b)
现在填写a
的第一个维度,该维度将作为结果的最后一个模糊点通过:
In [495]: np.einsum('kj,ij->ik', a, b)
Out[495]:
array([[ 2, -1, 3],
[ 5, -4, 6]])
切换参数,出现常规的2d点积:
In [496]: np.einsum('ij,kj->ik', b, a)
Out[496]:
array([[ 2, -1, 3],
[ 5, -4, 6]])
In [497]: b.dot(a.T) # b@(a.T)
Out[497]:
array([[ 2, -1, 3],
[ 5, -4, 6]])