ネストされたラムダ:MapAtラムダのMapThreading
Oct 10 2020
(ここで)3シリーズのセットを考えてみましょう
r`data = Thread[{Range@4, # Range@4}] & /@ (10 Range@3);
(*{
{{1, 10}, {2, 20}, {3, 30}, {4, 40}},
{{1, 20}, {2, 40}, {3, 60}, {4, 80}},
{{1, 30}, {2, 60}, {3, 90}, {4, 120}}
}*)
目的は、各シリーズの各ポイントの2番目の座標を除数で除算することです。 divs[[i]]
r`divs = 10 Range@3;
(*{10, 20, 30}*)
私は現在これを次のように達成しています
r`f[x_] := #/x &
MapThread[MapAt[r`f@#2, #1, {All, 2}] &, {r`data, r`divs}]
(*{
{{1, 1}, {2, 2}, {3, 3}, {4, 4}},
{{1, 1}, {2, 2}, {3, 3}, {4, 4}},
{{1, 1}, {2, 2}, {3, 3}, {4, 4}}
}*)
内に存在r`fする分割ラムダを直接ネストすることを支持して排除する方法は?#/x &MapAtMapThread
言い換えれば、そのようなものを正しく書く方法
MapThread[MapAt[#/#2 &, #1, {All, 2}] &, {r`data, r`divs}]
^
|
|
should refer to second coord of point
and not r`data[[i]]
同様の質問(ネストされたマップ上のMapThreadなど)を実行しましたが、現在のケースにそれらのソリューションを適用できなかったことに注意してください。
回答
7 kglr Oct 10 2020 at 01:06
MapThread[MapAt[z \[Function] z/#2, #1, {All, 2}] &, {r`data, r`divs}]
または
MapThread[MapAt[Function[z, z/#2], #1, {All, 2}] &, {r`data, r`divs}]
または
MapThread[Function[{x, y}, MapAt[#/y &, x, {All, 2}]], {r`data, r`divs}]
{{{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}}
または、
Transpose[Transpose[#]/{1, #2}] & @@@ Transpose[{r`data, r`divs}]
MapThread[Transpose[Transpose[#]/{1, #2}] &, {r`data, r`divs}]
MapThread[ReplacePart[#, {i_, 2} :> #[[i, 2]]/#2] &, {r`data, r`divs}]
SubsetMap[Flatten[Partition[#, First[Length /@ r`data]]/r`divs] &, r`data,
{All, All, 2}]
Module[{z = r`data}, z[[All, All, 2]] = z[[All, All, 2]]/r`divs;z]
すべて与える
{{{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}}
そして...ハロウィーンスペシャル:
☺[{r`data, r`divs}]
{{{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}}
4 m_goldberg Oct 10 2020 at 05:56
ReplacePartマッピング関数の代わりに使用することにより、明示的にあなたのように、r`fまたは純粋関数として、関数を定義する必要はありません。
data = Thread[{Range @ 4, # Range @ 4}]& /@ (10 Range @ 3);
divisors = 10 Range @ 3;
ReplacePart[
data,
{i_, j_} :> Module[{m = data[[i, j]]}, m[[2]] = m[[2]]/divisors[[i]]; m]]
{{{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}}
3 WReach Oct 10 2020 at 21:11
Mathematicaバージョン12.1+我々は使用することができますOperatorAppliedを内部関数に外側の引数を注入します。
MapThread[MapAt[OperatorApplied[#/#2&][#2], #1, {All, 2}] &, {r`data, r`divs}]
(*
{{1, 1}, {2, 2}, {3, 3}, {4, 4}},
{{1, 1}, {2, 2}, {3, 3}, {4, 4}},
{{1, 1}, {2, 2}, {3, 3}, {4, 4}}
*)
バージョン11.3以降のカレーも同じことをしますが、現在は廃止されていると見なされています。これらおよび関連する構造の詳細については、(197168)を参照してください。