リストや式への関数の部分的適用

リストの取扱いにおいて,リストの要素ひとつひとつに関数を作用させなければならないときがある.そのようなときは,Wolfram言語ではMapを使う.

入力したリストの各要素にを適用する.
In[1]:=
Click for copyable input
Out[1]=
入力したリストの最初の2要素を抽出する関数を定義する.
In[2]:=
Click for copyable input
Mapを作用させ,をリストの各要素に適用させる.
In[3]:=
Click for copyable input
Out[3]=
Map[f,{a,b,}]入力リストの各要素(第1レベル)に f を作用させ,リスト を構成する

リスト要素への関数の適用

Map[f,expr]を使うと,関数 f を式 expr の各要素に個別に適用することができる.Map適用の対象になる式はリストだけでなくどんな式でもよい.

加法式の各要素にを適用させる.
In[4]:=
Click for copyable input
Out[4]=
こうすると,の各引数にSqrtを適用させることができる.
In[5]:=
Click for copyable input
Out[5]=

Map[f,expr]は,関数 f を式 expr の第1レベルに適用させるためにある.関数 f を式 expr の全部分に適用させるにはMapAll[f,expr]を使う.

2x2行列を定義しておく.
In[6]:=
Click for copyable input
Out[6]=
Mapを使い,の第1レベルにを適用させる.この場合,第1レベルは行列の列に相当する.
In[7]:=
Click for copyable input
Out[7]=
MapAllを使うと,の全レベルに適用される.出力された式を見ると,関数がすべての部分に適用されているのが分かる.
In[8]:=
Click for copyable input
Out[8]=

Mapの使用において,「式におけるレベル」で説明してあるレベルの指定法を使うことで,式の任意部分に関数を適用させることもできる.

レベル2のの部分だけにを適用させる.
In[9]:=
Click for copyable input
Out[9]=
Heads->Trueの設定をしておくと,要素だけでなく各部分の頭部にもを適用させることができる.
In[10]:=
Click for copyable input
Out[10]=
Map[f,expr] または f/@exprexpr のレベル1の各部分に関数 f を適用する
MapAll[f,expr] または f//@exprexpr にあるすべての部分に関数 f を適用する
Map[f,expr,lev]expr の任意レベル lev の各部分に関数 f を適用する

式の違った部分に関数を適用させるためのいくつかの方法

Mapにレベル指定をしておくことで,適用させたい関数を式のどのレベルにでも適用させることが可能である.また,MapAtを使えば,関数を適用させたい式の部分を位置で指定することもできる.位置は,「式の部分抽出」で説明してある添数の指定法に従い指定する.

2x3行列を入力する.
In[11]:=
Click for copyable input
Out[11]=
部分と部分を適用させる.
In[12]:=
Click for copyable input
Out[12]=
の中でが現れる位置のリストを作る.
In[13]:=
Click for copyable input
Out[13]=
Positionにより作成された位置リストを直接MapAtに与えることもできる.
In[14]:=
Click for copyable input
Out[14]=
まぎらわしさを避けるため,位置はリスト形式で指定する必要がある.指定する添数が1つしかない場合もである.
In[15]:=
Click for copyable input
Out[15]=
MapAt[f,expr,{part1,part2,}]f を式 expr の指定された部分に適用する

式の任意部分への関数の適用

式を入力する.
In[16]:=
Click for copyable input
Out[16]=
完全形での内容を確認する.
In[17]:=
Click for copyable input
Out[17]//FullForm=
MapAtはどんな式にも使えるが,部分は完全形の並び順に基づいて指定されることに注意.
In[18]:=
Click for copyable input
Out[18]=
MapIndexed[f,expr]式の要素に f を適用する(各要素の添数を第2引数とした f を返す)
MapIndexed[f,expr,lev]式において任意のレベルの各部分に f を適用する(各部分の添数からなるリストを第2引数とした f を返す)

式の部分と添数への関数の適用

入力リストの各要素にを適用させる.結果は,要素の添数をの第2引数とした形で得ることができる.
In[19]:=
Click for copyable input
Out[19]=
行列のレベル1,2の両方にを適用させる.
In[20]:=
Click for copyable input
Out[20]=

Mapを使うことで,単引数の関数をある式の任意部分に適用することができる.しかし,関数が複数の引数を必要とし,それを複数の式に並列的に適用したい場合には使えない.そのようなときは,MapThreadを代りに使う.

MapThread[f,{expr1,expr2,}] の複数式において同じ位置の要素をまとめ,各まとまりに対して f を適用する
MapThread[f,{expr1,expr2,},lev] の複数式において指定したレベルにある同じ位置の部分をまとめ,各まとまりに対して f を適用する

複数式への関数の同時適用

リストにおける同じ位置の要素でペアを組み,ペアごとにを適用する.
In[21]:=
Click for copyable input
Out[21]=
MapThreadの適用対象となる式はいくつあっても構わないが,それらは同じ構造であることが必要である.
In[22]:=
Click for copyable input
Out[22]=

Map等の関数を使うことで,部分的に変更した式を生成することができる.場合によっては,新しい式を構築しないで,単に特定の関数を式の部分に作用させる,ということだけを行いたい.例えば,適用させる関数が割当て操作や出力の生成等の副作用をもたらす場合はこれに当たる.

Scan[f,expr]expr の各要素に f を順次適用し評価する
Scan[f,expr,lev]expr の特定レベル lev の各部分に f を順次適用し評価する

複数式の部分への関数の順次適用と評価

Mapは,入力リストの各要素にを適用させた新たなリストを構築する.
In[23]:=
Click for copyable input
Out[23]=
Scanは,関数を各要素に適用することで得られた結果を評価はするが,新たな式は生成しない.
Scan操作は,深さ優先探索で(木表示の葉の部分)から始まる.