How to | リストに関数をマップする方法
Wolfram言語にはリストを使用するための強力な操作が数多く含まれている.リストの個々の要素に関数をマップすることが望ましい場合が多くある.リストを作成できる関数はこの操作をデフォルトで行うが,リストを作成しない関数については関数Mapを使ってこの操作を行うことができる.
mylist = Range[5]Mapを使うとリストのすべての要素それぞれに関数をマップすることができる.以下の例では未定義の関数であるfを使う:
Map[f, mylist]「/@」をMapの簡略表記として使うことができる(これは上の例と同じコマンドである):
f /@ mylist数学関数の多くがListableの特性を持つ.つまり,これらの関数は自動的にリストにマップされる:
Attributes[Sin]Sin[mylist]関数がListableではない場合は,代りにMapを使うことができる.5個の2×2行列のリストを設定する:
matrices = RandomInteger[1, {5, 2, 2}]Mapを使って,MatrixFormをリストに対してマップし,それぞれを数学表記で見る:
MatrixForm /@ matrices今度はMapを使ってリストの行列それぞれについて固定値を計算する:
Eigenvalues /@ matricesMapは,単にリストだけに働くものではなく,どのような式にでも使うことができる:
Map[f, a + b + c + d]Applyは,もうひとつの関数プログラミング操作である.これは式の頭部を置換する.
この関数がどのように働くかを2つの未定義関数(fとg)を使って見ることができる:
Apply[f, g[a, b, c, d]]Applyの簡略表記は「@@」である(これは上の例と同じコマンドである):
f@@g[a, b, c, d]よく使われる式はWolfram言語においてStandardFormで表示されるが,その内在するFullFormはApplyをいかに使用するかを示している:
{Plus[a, b, c], Times[a, b, c], List[a, b, c]}Apply[Times, a + b + c]Applyは,リストの要素を関数の引数に変換させたい場合に便利である.
pairs = RandomInteger[{1, 10}, {5, 2}]順序対の最初の数を2番目で割る場合にModは残余を求める:
Mod[10, 4]Modをすべての対に適用する場合には,リストのレベル1({1}で指定される)で作業する必要がある:
Apply[Mod, pairs, {1}]「@@@」を簡略表記として使ってレベル1で適用することができる:
Mod@@@pairs次は,Functionを純関数とともに使って同じことを行う別の方法である:
Map[Function[w, Apply[Mod, w]], pairs]次はFunctionの短縮形を使う:
Map[Apply[Mod, #]&, pairs]