概述
在numpy中,我有一个可以是2-D或3-D的数组,我想将它减少到2-D,同时对每个元素求平方.所以我尝试了这个并不起作用:
A = np.random.rand(5,3,3)
np.einsum('...ij,...ij->ij',A,A)
它返回此错误:
ValueError: output has more dimensions than subscripts given in einstein sum,but no '...' ellipsis provided to broadcast the extra dimensions.
我想einsum并不认为当省略号在右侧消失时,我想要省略省略号(如果它们存在).是否有一些“优雅”的方式(即没有检查维数和使用if语句)告诉它我想为3-D做这个:
A = np.random.rand(5,3)
np.einsum('aij,aij->ij',A)
这对于2-D?
A = np.random.rand(3,3)
np.einsum('ij,ij->ij',A)
省略号用于“骑行”的尺寸,而不是您想要特定控制的尺寸.在这里,您要总结初始维度,因此您需要明确地对其进行索引:
In [161]: np.einsum('i...,i...',A)
Out[161]:
array([[ 1.26942035,1.32052776,1.74118617],[ 1.59679765,1.49331565,2.04573002],[ 2.29027005,1.48351522,1.36679208]])
In [162]: np.einsum('aij,A)
Out[162]:
array([[ 1.26942035,1.36679208]])
对于2D阵列:
In [165]: np.einsum('ij,A[0],A[0])
Out[165]:
array([[ 0.20497776,0.11632197,0.65396968],[ 0.0529767,0.24723351,0.27559647],[ 0.62806525,0.33081124,0.57070406]])
In [166]: A[0]*A[0]
Out[166]:
array([[ 0.20497776,0.57070406]])
In [167]:
In [167]: np.einsum('...,...',A[0])
Out[167]:
array([[ 0.20497776,0.57070406]])
我认为你不能用一个表达式处理这两种情况.
获得第一笔金额的另一种方法
In [168]: (A*A).sum(axis=0)
Out[168]:
array([[ 1.26942035,1.36679208]])
我提供了修复省略号处理的补丁,但那是几年前的事.所以细节在我的脑海里并不是很新鲜.作为其中的一部分,我反向设计解析字符串表达式(原始编译),并且可以查看该代码(或引用您),如果我们需要更明确的答案.
In [172]: np.einsum('...ij,A)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
错误消息说它正在尝试将…维度传递给输出,而不能 – 因为输出缺少维度或….换句话说,它不会对…维度执行求和.它们传递给输出不变(适用广播规则).
总结
以上是编程之家为你收集整理的python – 在numpy.einsum中对省略号广播维度求和全部内容,希望文章能够帮你解决python – 在numpy.einsum中对省略号广播维度求和所遇到的程序开发问题。
如果您也喜欢它,动动您的小指点个赞吧