在numpy中,我们可以在两个向量a和b之间执行“外加法”,如下所示:a=np.c_[1,2,3]b=np.c_[4,5,6]result=a+b.T#alternativelythiscanbea.T+b是否可以使用einsum进行相同的计算?还有其他快速选择吗?如果a等于b怎么样? 最佳答案 此操作的另一种快速替代方法是使用:np.add.outer(a,b) 关于python-numpyeinsum()可以执行外加法吗?,我们在StackOverflow上找到一个类似的问题:
抱歉标题解释不当。我正在尝试并行化我的一部分代码并卡在点积上。我正在寻找一种有效的方法来执行下面的代码,我确信有一个简单的线性代数解决方案,但我很困惑:puy=np.arange(8).reshape(2,4)puy2=np.arange(12).reshape(3,4)printpuy,'\n'printpuy2.Tzz=np.zeros([4,2,3])foriinrange(4):zz[i,:,:]=np.dot(np.array([puy[:,i]]).T,np.array([puy2.T[i,:]])) 最佳答案 一种方法
出于性能原因,我很好奇是否有一种方法可以将一堆矩阵相乘。我有一个4维数组(500、201、2、2)。它基本上是一个500个长度的(201,2,2)矩阵堆栈,对于500个矩阵中的每一个,我想使用einsum将相邻矩阵相乘并得到另一个(201,2,2)矩阵。最后我只对[2x2]矩阵进行矩阵乘法。由于我的解释已经偏离轨道,我将只展示我现在正在做的事情,以及“减少”等效项以及为什么它没有帮助(因为它在计算上的速度相同)。最好这将是一个NumPy的单行,但我不知道那是什么,或者即使它可能。代码:Arr=rand(500,201,2,2)defloopMult(Arr):ArrMult=Arr[0
我希望在python(numpy)中执行以下操作。MatrixAisMxNxRMatrixBisNx1xR矩阵乘法AB=C,其中C是Mx1xR矩阵。本质上,A的每个MxN层(其中R层)都是与B中的每个Nx1向量独立相乘的矩阵。我确信这是一个单线。我一直在尝试使用tensordot(),但我似乎给出了我不期望的答案。我已经使用IgorPro编程将近10年了,现在我正在尝试将它的页面转换为python。 最佳答案 对于死灵法术感到抱歉,但是使用无价的np.einsum可以大大改进这个答案。importnumpyasnpD,M,N,R=1
关联网站:einops官网torch.einsum(equation,*operands)→Tensor对输入元素operands沿指定的维度、使用爱因斯坦求和符号的乘积求和。参数:equation(string)–爱因斯坦求和的下标。operands(List[Tensor])——计算爱因斯坦求和的张量。Einsum允许计算许多常见的多维线性代数数组运算,方法是根据由equation给出的爱因斯坦求和约定,以速记(short-hand)格式表示它们。这种格式的细节在下面描述,但通常想法是operands用一些下标标记输入的每个维度,并定义哪些下标是输出的一部分,operands然后通过对下
我在“np.einsum”的文档中了解到,排列字符串会给出向量中轴的排列。以下实验证实了这一点:>>>M=np.arange(24).reshape(2,3,4)>>>M.shape(2,3,4)>>>np.einsum('ijk',M).shape(2,3,4)>>>np.einsum('ikj',M).shape(2,4,3)>>>np.einsum('jik',M).shape(3,2,4)但是这个我无法理解:>>>np.einsum('kij',M).shape(3,4,2)我会期望(4,2,3)而不是...我的理解有什么问题吗? 最佳答案
我正在使用np.einsum乘以概率表,例如:np.einsum('ijk,jklm->ijklm',A,B)问题是我总共要处理超过26个随机变量(轴),所以如果我为每个随机变量分配一个字母,我就会用完所有字母。有没有另一种方法可以指定上述操作来避免此问题,而无需求助于np.sum和np.dot操作的困惑? 最佳答案 简短的回答是,您可以使用52个字母中的任何一个(大写字母和小写字母)。这就是英语中的所有字母。任何更漂亮的轴名称都必须映射到这52个或一组等效的数字上。实际上,您将希望在任何一个中使用这52个中的一小部分einsum打
好的,所以我有几个sympy对象(表达式)的多维numpy数组。例如:A=array([[1.0*cos(z0)**2+1.0,1.0*cos(z0)],[1.0*cos(z0),1.00000000000000]],dtype=object)等等。我想做的是使用einsum将这些数组中的几个相乘,因为我已经从我之前进行的数值计算中获得了相应的语法。问题是,当我尝试做类似的事情时einsum('ik,jkim,j',A,B,C)我收到类型错误:TypeError:invaliddatatypeforeinsum当然,在Google上快速搜索显示einsum可能无法执行此操作,但没有理由
我正在将Python加速器(Numba、Cython、f2py)与简单的For循环和Numpy的einsum进行比较以解决特定问题(见下文)。到目前为止,Numpy是解决这个问题最快的(快6倍),但如果我应该尝试其他优化,或者我做错了什么,我想要一些反馈。这个简单的代码基于一个更大的代码,该代码有许多这样的einsum调用,但没有显式的for循环。我正在检查这些加速器中的任何一个是否可以做得更好。在MacOSXYosemite上使用Python2.7.9完成计时,安装了来自Homebrew的gcc-5.3.0(--with-fortran--without-multilib)。也做了%
我通常从numpy的einsum函数中获得良好的性能(我喜欢它的语法)。@Ophion对thisquestion的回答表明-对于测试的案例-einsum始终优于“内置”功能(有时略胜一筹,有时胜过很多)。但是我刚刚遇到了einsum慢很多的情况。考虑以下等效函数:(M,K)=(1000000,20)C=np.random.rand(K,K)X=np.random.rand(M,K)deffunc_dot(C,X):Y=X.dot(C)returnnp.sum(Y*X,axis=1)deffunc_einsum(C,X):returnnp.einsum('ik,km,im->i',X,C