如何在python中为每对矩阵向量内积分开?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在python中为每对矩阵向量内积分开?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1898字,纯文字阅读大概需要3分钟。
内容图文
![如何在python中为每对矩阵向量内积分开?](/upload/InfoBanner/zyjiaocheng/667/86f65026fa404545b6fe4d64f08669e6.jpg)
可以说,我有一堆矩阵As和向量bs.
As = array([[[1, 7], [3, 8]],
[[2, 1], [5, 9]],
[[7, 2], [8, 3]]])
bs = array([[8, 0], [8, 8], [7, 3]])
当我执行np.inner(As,bs)时,我得到:
array([[[ 8, 64, 28], [ 24, 88, 45]],
[[ 16, 24, 17], [ 40, 112, 62]],
[[ 56, 72, 55], [ 64, 88, 65]]])
但是我不需要所有内部产品.我想要的是一次计算每个向量的每个矩阵.
我可以做这样的事情:
np.array(map(lambda (a, b): np.inner(a, b), zip(As, bs)))
然后我得到预期的矩阵:
array([[ 8, 24], [ 24, 112], [ 55, 65]])
现在,我不想使用zip,map等,因为我需要此操作> 10 ** 6时间(用于图像处理,完全用于GMM).
有什么方法可以使用numpy,scipy等为我做这件事吗? (快速高效)
解决方法:
您可以使用np.einsum–
np.einsum('ijk,ik->ij',As, bs)
说明
使用np.array(map(lambda(a,b):np.inner(a,b),zip(As,bs)))),我们选择第一个元素as作为a,选择bs作为b并进行内部产品.因此,我们正在做:
In [19]: np.inner(As[0],bs[0])
Out[19]: array([ 8, 24])
In [20]: np.inner(As[1],bs[1])
Out[20]: array([ 24, 112])
In [21]: np.inner(As[2],bs[2])
Out[21]: array([55, 65])
将其视为一个循环,我们迭代3次,对应于As第一轴的长度,与bs相同.因此,看一下lambda表达式,在每次迭代中,我们有一个= As [0]& b = bs [0],a = As [1]& b = bs [1],依此类推.
由于and bs是3D和2D,所以我们将它们表示为在我们的脑海中想象内部产品的迭代器.因此,在迭代时,我们将有一个:j,k和b:m.如果内部积在a和b之间,我们将失去a的第二个轴和b的第一个轴.因此,我们需要将k与m对齐.因此,我们可以假设b与k具有相同的迭代器.从a到As,从b到bs,从本质上讲,由于内积/总和的减少,我们将失去第三个轴,而As失去了第三轴.沿第一个轴对As和bs进行迭代表明,我们需要在这些和减少量下保持对齐.
让我们总结一下.
我们让输入数组涉及迭代器,如下所示:
As : i x j x k
bs : i x k
预期操作涉及的步骤:
>保持As的第一个轴与bs的第一个轴对齐.
>相对于bs的秒数减少总和而使As的第三轴丢失.
因此,我们将剩下迭代器i,j作为输出.
np.einsum是一种非常有效的实现,当我们需要使输入数组的一个或多个轴彼此对齐时,它特别方便.
有关einsum的更多信息,我建议遵循前面提供的docs链接,并且this Q&A也可能会有所帮助!
内容总结
以上是互联网集市为您收集整理的如何在python中为每对矩阵向量内积分开?全部内容,希望文章能够帮你解决如何在python中为每对矩阵向量内积分开?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。