如何对2D数组和另一个向量之间的操作进行向量化?

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

我有一个像这样的numpy 2D数组:

[[1, 2], [3, 4]]

以及一个类似的向量:[5, 6]

在这种情况下,操作是np.inner,这是我在2D数组的每一行和单独的矢量之间获取余弦相似度的更大任务的一部分。

我的预期输出是[np.inner([1, 2], [5, 6]), np.inner([3, 4], [5, 6]]。我可以使用apply_along_axis完成此操作,但是有什么方法可以矢量化此操作并使它比apply_along_axis更具性能?

关于如何在两个2D数组的成对行之间矢量化这些类型的操作,有很多已回答的问题,但是在这种情况下,我需要对一个2D数组和另一个矢量之间的操作进行矢量化。我可以将[5, 6]转换为[[5, 6], [5, 6]],然后以这种方式进行矢量化,但是在大规模应用时,我需要一个解决方案,在该操作中我可以在操作中使用其他矢量本身,而不是将其转换为带有一排行的2D数组副本。

python numpy scipy vectorization cosine-similarity
2个回答
3
投票

听起来像您需要`np.dot'

In [3]: a = np.array([[1, 2], [3, 4]])

In [4]: b = np.array([5, 6])

In [5]: a.dot(b)
Out[5]: array([17, 39])

In [6]: np.inner(a[0], b)
Out[6]: 17

In [7]: np.inner(a[1], b)
Out[7]: 39

0
投票
In [6]: A = np.array([[1,2],[3,4]]); x=np.array([5,6])                                           

inner可以与您的2d数组一起使用(诚然,其文档对此有点含糊不清]

In [7]: np.inner(A,x)                                                                            
Out[7]: array([17, 39])

通常我们使用np.dot进行矩阵乘法,包括1d inner

In [8]: np.dot(A,x)                                                                              
Out[8]: array([17, 39])

或在较新的numpy中,@运算符,它也是np.matmul

In [9]: A@x                                                                                      
Out[9]: array([17, 39])

[都使用last of A与B`的第二到最后(或x的唯一轴)。

您想要的两个内部计算:

In [10]: np.inner(A[0,:],x)                                                                      
Out[10]: 17
In [11]: np.inner(A[1,:],x)                                                                      
Out[11]: 39

[(2,n)数组与(n,)数组一起广播,很好,产生了(2,n)结果

In [12]: A * x                                                                                   
Out[12]: 
array([[ 5, 12],
       [15, 24]])
In [13]: (A * x).sum(axis=1)       # and sum on the `n` axis for inner                                                                 
Out[13]: array([17, 39])

[broadcasting具有重复行(或其他维度)的效果,但计算效率高。]

© www.soinside.com 2019 - 2024. All rights reserved.