python - 如何向量化二维数组和另一个向量之间的操作?
问题描述
我有一个像这样的 numpy 二维数组:
[[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
?
关于如何在两个二维数组的行对之间向量化这些类型的操作,有很多已回答的问题,但在这种情况下,我需要对一个二维数组和另一个向量之间的操作进行向量化。我可以变成[5, 6]
然后[[5, 6], [5, 6]]
以这种方式进行矢量化,但是在大规模情况下,我需要一个解决方案,我可以在操作中使用另一个矢量本身,而不是将其变成带有一堆行副本的二维数组。
解决方案
In [6]: A = np.array([[1,2],[3,4]]); x=np.array([5,6])
inner
确实适用于您的二维数组(诚然,它的文档对此有点模糊
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
具有重复行(或其他维度)的效果,但计算效率很高。
推荐阅读
- javascript - 路由路径包含将被提取到 beforeRouteEnter 中的数据
- java - 如何在 Java 中使用 CUDA 实现并行处理?
- r - ggplot中的粗体轴标签
- json - IntelliJ 不认为隐式导入是有用的
- graphql - 放大 - 将两个模式值合并为一个以用于连接链接
- flutter - 使用按钮刷新/重建页面
- python - Python和Maya:访问按钮启动的另一个函数中的变量
- javascript - 来自表单输入的值不会通过提交按钮传输。我该如何解决?
- elasticsearch - 如何限制 Elasticsearch 文档中的字段被更新?
- java - Java Rest Client bodyToMono 泛型