중첩 된 람다 : MapThreading a MapAt lambda
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}}
}*)
의도는 각 계열에서 각 점의 두 번째 좌표를 일부 제수로 나누는 것입니다. 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]]
유사한 질문 (예 : 중첩 된 Map의 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
에서는 티카 버전 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+의 Curry 는 동일한 작업을 수행하지만 이제는 구식으로 간주됩니다. 이들 및 관련 구성에 대한 자세한 내용은 (197168)을 참조하십시오 .