簡體   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