矩阵向量与标量向量的Numpy-点积

问题描述 投票:5回答:2

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

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

我希望numpy将数据视为2890x10矩阵的643长度的1-D数组,并计算数据和矢量之间的点积(求和​​积?)。我可以使用循环来执行此操作,但是我真的很想找到一种使用原语来执行此操作的方法(它将在并行节点上运行多次)。

等效循环(我相信):

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
2个回答
5
投票

如果您的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]])

0
投票

先前的答案使用了正确的numpy函数,但是没有给出要求的结果。

应该是:

np.einsum('i, ijk -> ijk', vector, data)
© www.soinside.com 2019 - 2024. All rights reserved.