gpt4 book ai didi

wolfram-mathematica - 数学 : reconstruct an arbitrary nested list after Flatten

转载 作者:行者123 更新时间:2023-12-04 07:44:27 33 4
gpt4 key购买 nike

映射任意时髦的嵌套列表的最简单方法是什么expr到函数 unflatten以便 expr==unflatten@@Flatten@expr ?

动机:Compile只能处理完整的数组(我刚学到的东西——但不是从错误消息中学到的),所以想法是使用 unflatten连同扁平表达式的编译版本:

fPrivate=Compile[{x,y},Evaluate@Flatten@expr];
f[x_?NumericQ,y_?NumericQ]:=unflatten@@fPrivate[x,y]

一个不太普遍的问题的解决方案示例:
我实际上需要做的是计算给定多元函数的所有导数,直到某个阶。对于这种情况,我是这样破解的:
expr=Table[D[x^2 y+y^3,{{x,y},k}],{k,0,2}];
unflatten=Module[{f,x,y,a,b,sslot,tt},
tt=Table[D[f[x,y],{{x,y},k}],{k,0,2}] /.
{Derivative[a_,b_][_][__]-> x[a,b], f[__]-> x[0,0]};
(Evaluate[tt/.MapIndexed[#1->sslot[#2[[1]]]&,
Flatten[tt]]/. sslot-> Slot]&) ]

Out[1]= {x^2 y + y^3, {2 x y, x^2 + 3 y^2}, {{2 y, 2 x}, {2 x, 6 y}}}
Out[2]= {#1, {#2, #3}, {{#4, #5}, {#5, #7}}} &

这是有效的,但它既不优雅也不通用。

编辑:这是aaz提供的解决方案的“工作安全”版本:
makeUnflatten[expr_List]:=Module[{i=1},
Function@Evaluate@ReplaceAll[
If[ListQ[#1],Map[#0,#1],i++]&@expr,
i_Integer-> Slot[i]]]

它的魅力在于:
In[2]= makeUnflatten[expr]
Out[2]= {#1,{#2,#3},{{#4,#5},{#6,#7}}}&

最佳答案

你显然需要保存一些关于列表结构的信息,因为 Flatten[{a,{b,c}}]==Flatten[{{a,b},c}] .

ArrayQ[expr] ,那么列表结构由 Dimensions[expr] 给出你可以用 Partition 重建它.例如。

expr = {{a, b, c}, {d, e, f}};
dimensions = Dimensions[expr]

{2,3}

unflatten = Fold[Partition, #1, Reverse[Drop[dimensions, 1]]]&;
expr == unflatten @ Flatten[expr]

( Partition 手册页实际上有一个名为 unflatten 的类似示例。)

expr不是数组,你可以试试这个:
expr = {a, {b, c}};
indexes = Module[{i=0}, If[ListQ[#1], Map[#0, #1], ++i]& @expr]

{1, {2, 3}}

slots = indexes /. {i_Integer -> Slot[i]}

{#1, {#2, #3}}

unflatten = Function[Release[slots]]

{#1, {#2, #3}} &

expr == unflatten @@ Flatten[expr]

关于wolfram-mathematica - 数学 : reconstruct an arbitrary nested list after Flatten,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5000229/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com