繁体   English   中英

使用 numpy 的相应行的向量点积

[英]Vector dot product of corresponding rows using numpy

我需要计算 numpy 中两个二维 arrays uv对应行的向量点积。 u的行是单位向量。 这是一些示例代码,说明了我正在尝试做的事情:

import numpy as np

u = np.array([[1, 0], [.6, .8], [0, 1]])
v = np.array([[1, 2], [3 ,  4], [5, 6]])

我天真地尝试使用numpy的dot方法,返回错误如下:

np.dot(u, v)
ValueError                                Traceback (most recent call last)
<ipython-input-9-146fe9079c1e> in <module>
----> 1 np.dot(u,v)

<__array_function__ internals> in dot(*args, **kwargs)

ValueError: shapes (3,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)

定义产生所需行为的 function 很简单:

def mydot(a, b):
    return np.sum(a*b,axis=1,keepdims=True)
mydot(u,v)
array([[1.],
[5.],
[6.]])

然而,这似乎有点笨拙,让我怀疑我错过了什么。 有没有更直接的 numpy 方法来做到这一点?

你的方法很好。 同时,您可以使用带有额外维度的matmul将 1x2 的堆栈乘以 2x1 矩阵:

u[..., None] @ v[:, None, :]

matmuldot最大的区别是matmul广播初始维度,而dot将它们组合起来。

但最快的方法可能是einsum

np.einsum('ij,ij->i', u, v)

np.dot在用于 2D arrays 时充当矩阵乘法,因此np.dot(v,uT)这不会给您错误。 但是对于点积,你可以使用这个:

np.sum(v*u,axis=1)

v*u只需在np.sum()中广播 2D 数组和轴,就可以让您 select 您想要计算点积的维度。 我希望你明白了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM