加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在NumPy中将元素方式和矩阵乘法与多维数组相结合

发布时间:2020-12-16 22:03:28 所属栏目:Python 来源:网络整理
导读:我有两个多维NumPy数组A和B,其中A.shape =(K,d,N)和B.shape =(K,N,d).我想在轴0(K)上执行逐元素操作,该操作是在轴1和2(d,N和N,d)上的矩阵乘法.因此结果应该是具有C.shape =(K,d)的多维数组C,因此C [k] = np.dot(A [k],B [k]).一个天真的实现看起来像这样: C

我有两个多维NumPy数组A和B,其中A.shape =(K,d,N)和B.shape =(K,N,d).我想在轴0(K)上执行逐元素操作,该操作是在轴1和2(d,N和N,d)上的矩阵乘法.因此结果应该是具有C.shape =(K,d)的多维数组C,因此C [k] = np.dot(A [k],B [k]).一个天真的实现看起来像这样:

C = np.vstack([np.dot(A[k],B[k])[np.newaxis,:,:] for k in xrange(K)])

但这种实施很慢.稍微快一点的方法看起来像这样:

C = np.dot(A,B)[:,:]

它在多维数组上使用np.dot的默认行为,给我一个形状为(K,K,d)的数组.但是,这种方法计算所需答案K次(沿轴2的每个条目都相同).渐渐地,它将比第一种方法慢,但开销要小得多.我也知道以下方法:

from numpy.core.umath_tests import matrix_multiply
C = matrix_multiply(A,B)

但我不能保证这个功能可用.因此,我的问题是,NumPy是否提供了一种有效执行此操作的标准方法?一般来说,适用于多维数组的答案是完美的,但仅针对这种情况的答案也是很好的.

编辑:正如@Juh_所指出的,第二种方法是错误的.正确的版本是:

C = np.dot(A,B).diagonal(axis1=0,axis2=2).transpose(2,1)

但是增加的开销使得它比第一种方法慢,即使对于小矩阵也是如此.对于小型和大型矩阵,最后一种方法是在我的所有时序测试中获胜.我现在正在考虑使用这个,如果没有更好的解决方案,即使这意味着将numpy.core.umath_tests库(用C语言编写)复制到我的项目中.

最佳答案
您的问题的可能解决方案是:

C = np.sum(A[:,np.newaxis]*B[:,np.newaxis,:],axis=2)

然而:

>只有当K比d和N大得多时,它比vstack方法更快
>它们可能是一些内存问题:在上述解决方案中,分配KxdxNxd数组(即,在求和之前所有可能的产品对).实际上我无法用大K,D和N进行测试,因为我的内存不足.

顺便说一句,请注意:

C = np.dot(A,:]

没有给出正确的结果.它让我被欺骗,因为我首先通过比较结果与此np.dot命令给出的结果来检查我的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读