在python中,如何将每对矩阵向量内积分开?

在python中,如何将每对矩阵向量内积分开?,python,numpy,matrix,vector,Python,Numpy,Matrix,Vector,比方说,我有一堆矩阵和向量 As = array([[[1, 7], [3, 8]], [[2, 1], [5, 9]], [[7, 2], [8, 3]]]) bs = array([[8, 0], [8, 8], [7, 3]]) 当我做np.inner(As,bs)时,我得到: 但我不需要所有的内部产品。我想要的是,用每个向量计算每个矩阵一次。 我可以这样做: np.array(map(lambda (a, b): np.inner(a,

比方说,我有一堆矩阵和向量

As = array([[[1, 7], [3, 8]],
            [[2, 1], [5, 9]],
            [[7, 2], [8, 3]]])
bs = array([[8, 0], [8, 8], [7, 3]])
当我做np.inner(As,bs)时,我得到:

但我不需要所有的内部产品。我想要的是,用每个向量计算每个矩阵一次。 我可以这样做:

np.array(map(lambda (a, b): np.inner(a, b), zip(As, bs)))
然后我得到了期望的矩阵:

array([[  8,  24], [ 24, 112], [ 55,  65]])
现在我不想使用zip、map等,因为我需要这个操作>10**6次(对于图像处理,正是对于GMM)。 有没有什么方法可以使用numpy、scipy等为我做到这一点?(快速有效)

您可以使用-

解释

使用
np.array(map(lambda(a,b):np.inner(a,b),zip(As,bs))
,我们选择
As
As
a
和off
bs
As
b
的第一个元素并进行内积。因此,我们正在做:

In [19]: np.inner(As[0],bs[0])
Out[19]: array([ 8, 24])

In [20]: np.inner(As[1],bs[1])
Out[20]: array([ 24, 112])

In [21]: np.inner(As[2],bs[2])
Out[21]: array([55, 65])
将其视为一个循环,我们迭代3次,对应于
as
的第一个轴的长度,这与
bs
的长度相同。因此,查看
lambda
表达式,在每次迭代中,我们有
a=As[0]&b=bs[0]
a=As[1]&b=bs[1]
等等

As
bs
3D
2D
,让我们将它们表示为迭代器,想象我们头脑中的内积。因此,在迭代时,我们将有
a:j,k
b:m
。由于
a
b
之间的内积,我们将失去
a
的第二个轴和
b
的第一个轴。因此,我们需要将
k
m
对齐。因此,我们可以假设
b
具有与
k
相同的迭代器。从
a
As
b
bs
,本质上,我们将失去
As
的第三个轴和
bs
的第二个轴以及内积/和减少。沿着第一个轴迭代
As
bs
意味着我们需要在这些总和缩减下保持一致

让我们总结一下

我们为输入数组使用了迭代器,如下所示-

As :  i x j x k 
bs :  i x k
预期操作中涉及的步骤:

  • 保持
    As
    的第一个轴与
    bs
    的第一个轴对齐
  • 失去
    As
    的第三个轴,与
    bs
    的第二个轴的总和减少
因此,我们只剩下迭代器
i,j
作为输出

np.einsum
是一个非常有效的实现,当我们需要使输入数组的一个或多个轴彼此对齐时,它特别方便


有关
einsum
的更多信息,我建议您遵循前面提供的文档链接,这也可能会有所帮助

@PiMathCLanguage添加了一些注释以帮助解决问题。看看那些。
In [19]: np.inner(As[0],bs[0])
Out[19]: array([ 8, 24])

In [20]: np.inner(As[1],bs[1])
Out[20]: array([ 24, 112])

In [21]: np.inner(As[2],bs[2])
Out[21]: array([55, 65])
As :  i x j x k 
bs :  i x k