【问题标题】:Numpy - Dot Product of a Vector of Matrices with a Vector of ScalarsNumpy - 矩阵向量与标量向量的点积
【发布时间】:2019-12-17 17:46:36
【问题描述】:

我有一个 3 维数据集,我正在尝试通过以下方式进行操作。

data.shape = (643, 2890, 10)
vector.shape = (643,)

我希望 numpy 将数据视为 2890x10 矩阵的 643 长度一维数组,并计算数据和向量之间的点积(和积?)。我可以通过循环来做到这一点,但我真的很想找到一种使用原语来做到这一点的方法(这将在并行节点上运行多次)。

等效循环(我相信):

a = numpy.zeros ((2890, 10))
for i in range (643):
   a += vector[i]*data[i]

非常感谢!对不起,如果这是一个转发,我已经搜索了很多地方,最后创建了一个帐户来问你们。

   a = numpy.array ([[[1,1,1,1],[2,2,2,2],[3,3,3,3]], [[3,3,3,3],[4,4,4,4],[5,5,5,5]]])
   b = numpy.array ([10,20])
# Thus, 
   a.shape = (2,3,4)
   b.shape = (2,)
# Want an operation . such that:
   a . b = [[10,10,10,10],[20,20,20,20],[30,30,30,30]] + [[60,60,60,60],[80,80,80,80],[100,100,100,100]]
         = [[70,70,70,70],[100,100,100,100],[130,130,130,130]]

【问题讨论】:

    标签: python numpy linear-algebra


    【解决方案1】:

    如果您的 NumPy 足够新(1.6 或更高版本),您可以使用numpy.einsum

    result = np.einsum('ijk,i -> jk', data, vector)
    

    In [36]: data = np.array ([[[1,1,1,1],[2,2,2,2],[3,3,3,3]], [[3,3,3,3],[4,4,4,4],[5,5,5,5]]])
    
    In [37]: vector = np.array ([10,20])
    
    In [38]: np.einsum('ijk,i -> jk', data, vector)
    Out[38]: 
    array([[ 70,  70,  70,  70],
           [100, 100, 100, 100],
           [130, 130, 130, 130]])
    

    或者,如果没有np.einsum,您可以向vector 添加额外的轴,并利用broadcasting 来执行乘法:

    In [64]: (data * vector[:,None,None]).sum(axis=0)
    Out[64]: 
    array([[ 70,  70,  70,  70],
           [100, 100, 100, 100],
           [130, 130, 130, 130]])
    

    【讨论】:

    • 非常感谢!完全按照我的意愿工作。
    • 据我所见,考虑问题中的最后一段代码,结果与预期不同。
    【解决方案2】:

    上一个答案使用了正确的 numpy 函数,但是它没有给出所要求的结果。

    应该是:

    np.einsum('i, ijk -> ijk', vector, data)
    

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      相关资源
      最近更新 更多