Python 自动加载的数组分配(不再:()

Python 自动加载的数组分配(不再:(),python,matrix,pytorch,autograd,Python,Matrix,Pytorch,Autograd,我有一个非常重要的函数,我想用autograd来区分它,但我不是一个足够的numpy向导,我不知道如何在没有数组辅助的情况下完成它 我也很抱歉,为了能够独立运行,我不得不让这个例子变得难以置信的做作和毫无意义。我正在使用的实际代码是针对非线性有限元的,并且试图计算复杂非线性系统的雅可比矩阵 将autograd.numpy作为anp导入 从autograd导入雅可比矩阵 def alphax: 返回anp.exp-x-10**2/x+1 def外汇: 矩阵的构造 k=anp.zerosx.shap

我有一个非常重要的函数,我想用autograd来区分它,但我不是一个足够的numpy向导,我不知道如何在没有数组辅助的情况下完成它

我也很抱歉,为了能够独立运行,我不得不让这个例子变得难以置信的做作和毫无意义。我正在使用的实际代码是针对非线性有限元的,并且试图计算复杂非线性系统的雅可比矩阵

将autograd.numpy作为anp导入 从autograd导入雅可比矩阵 def alphax: 返回anp.exp-x-10**2/x+1 def外汇: 矩阵的构造 k=anp.zerosx.shape[0],x.shape[0] 随机三维向量上的循环 对于anp.random.randint0,x.shape[0],x.shape[0],3中的元素: 从x中选择3个值 x_ijk=anp.array[[x[i]表示元素中的i]] norm=anp.linalg.norm x_ijk@anp.vstackelement,element.transpose 从元素中生成一些矩阵 m=element.restrape3,1@element.restrape1,3 alpha是一个任意可微函数R->R alpha_值=alphanorm 通过alpha_值将m个矩阵组合成k个比例 n=m.shape[0] 对于我在兰根: 对于兰根的j: k[元素[i],元素[j]+=m[i,j]*alpha_值 返回k@x printjacobianfanp.random.rand10 我们当然会出错 k[元素[i],元素[j]+=m[i,j]*alpha_值 ValueError:使用序列设置数组元素。 我不太明白这条消息,因为没有发生类型错误。我想它一定是来自赋值

在写了上面的内容之后,我做了一个简单的切换到PyTorch,代码运行得很好。但是我仍然更喜欢使用autograd

pytorch版本 进口火炬 从torch.autograd.gradcheck导入零梯度 def alphax: 返回火炬.expx def外汇: 矩阵的构造 k=火炬.zerosx.shape[0],x.shape[0] 随机三维向量上的循环 对于torch.randint0,x.shape[0],x.shape[0],3中的元素: 从x中选择3个值 x_ijk=torch.tensor[[1.如果n==e else 0表示范围中的n,则为lenx]表示元素中的e]@x norm=torch.norm x_ijk@torch.stacktorch.tanhelement.float+4,element.float-4.t m=torch.rand3,3 alpha是一个任意可微函数R->R alpha_值=alphanorm n=m.shape[0] 对于我在兰根: 对于兰根的j: k[元素[i],元素[j]+=m[i,j]*alpha_值 普林克 返回k@x x=torch.rand4,需要_grad=True printx,“\n” y=fx printy,“\n” 年级=[] 对于y中的val: val.backwardretain_图形=真 grads.appendx.grad.clone 零梯度 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 斯塔克格拉兹酒店
在Autograd和JAX中,不允许执行数组索引分配。有关此操作的部分说明,请参阅


PyTorch允许此功能。如果您想在autograd中运行代码,您必须找到一种方法删除有问题的行k[element[i],element[j]+=m[i,j]*alpha_值。如果您可以在JAX中运行代码,JAX的语法与autograd基本相同,但有更多的功能,那么它似乎有助于执行这种索引分配。

我自己只计算雅可比矩阵,省去了麻烦,但我以后会研究JAX。谢谢您的帮助。