Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Numpy:如何执行四个向量的外积,然后求和?_Python 3.x_Numpy_Tensor - Fatal编程技术网

Python 3.x Numpy:如何执行四个向量的外积,然后求和?

Python 3.x Numpy:如何执行四个向量的外积,然后求和?,python-3.x,numpy,tensor,Python 3.x,Numpy,Tensor,A=[a1,a2],B=[b1,b2],C=[c1,c2],D=[d1,d2] A,B,C,D的外积为: 在numpy中,外积因此是形状2、2、2、2的数组。我知道怎么做。问题是,我有100个这样的A,B,C,D。它们是通过修正k从A,B,C,D中取出来的。所以它们实际上是形状为2100或1002的数组。实际上可能是20,100或者100,20。我用2来简化写作。我想做的是:把这种外积做100次,然后总结。也就是说:对100个形状为2,2,2,2的数组求和。如何使用numpy有效地执行此操作?如

A=[a1,a2],B=[b1,b2],C=[c1,c2],D=[d1,d2]

A,B,C,D的外积为:

在numpy中,外积因此是形状2、2、2、2的数组。我知道怎么做。问题是,我有100个这样的A,B,C,D。它们是通过修正k从A,B,C,D中取出来的。所以它们实际上是形状为2100或1002的数组。实际上可能是20,100或者100,20。我用2来简化写作。我想做的是:把这种外积做100次,然后总结。也就是说:对100个形状为2,2,2,2的数组求和。如何使用numpy有效地执行此操作?如果更好的话,有没有GPU加速的方法

如果A,B,C,D只是一维数组,我知道怎么做。以下单行代码可以正常工作:

a[:, None, None, None] * b[None, :, None, None] * c[None, None, :, None] * d[None, None, None, :]

另外,仔细选择轴应该可以满足您的需要。

仅einsum应该可以处理np。einsum'ij、ik、ir、il->jkrl',A、B、C、D。同意-一次调用einsum可能比多次调用einsum+一次求和调用更有效,因为整个操作只在编译的C代码中处理一次,而不会返回python。另一方面,如果您是第一次使用einsum,那么编写多个调用可能更简单。我会先用简单的方法写,然后重构。非常感谢!真的很管用。同样,只需要一行代码:尽管einsum可以做我想做的事情,并且比使用许多for循环快得多,但它仍然不够快。我需要对这种外积求和几百次。每个einsum大约需要3分钟来计算。这样做400次需要1200分钟。有没有更快的办法?
a[:, None, None, None] * b[None, :, None, None] * c[None, None, :, None] * d[None, None, None, :]