向量列表乘以numpy einsum的一个矩阵

时间:2018-11-30 04:19:38

标签: python numpy

我有一个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)

有什么建议吗?

1 个答案:

答案 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)

dota的最后一个暗度与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]])