リスト
リストの作成 | リスト要素の追加,削除,変更 |
オブジェクトの集合を作る | リストの結合 |
数値の表を作る | リストの集合論的扱い |
リスト要素の操作 | リストの並べ替え |
ベクトルと行列 | リストの分割 |
部分リストの構成 | リストにおける順序 |
リスト要素の判定と検索 | 多次元リストの並べ替え |
計算を進めていく上で,複数のオブジェクトを1つにまとめて扱えると便利になる.複数のオブジェクトをまとめたものをリストと呼ぶ.後で説明するが,リストはWolfram言語の一般的な構造であり非常に重要なものである.
リストの簡単な例として,{3,5,1}がある.これは3つの数から構成されるリストである.リストにすることで3つのオブジェクトを一括で扱えるようになる.つまり,すべての要素について同じ計算をしたり,まとめて一変数としても扱えるようになる.
リストは1つの引数として扱われる.「数学関数」の数学関数はどれでも同様に使える:
「リストの作成」において,複数の数をまとめて扱うための一方法としてのリストの使い方に触れた.このチュートリアルでは,リストの違った使い方をいろいろ見ていく.Wolfram言語の数あるオブジェクトの中でも最も適用範囲が広く,かつ,機能的に強力なオブジェクトはリストであることが理解できると思う.そして,Wolfram言語のリストが,数学やコンピュータサイエンスにおけるいくつかの基本的な考え方を一般化したものであることも見えてくるだろう.
Wolfram言語に組み込まれているほとんどの数学関数は,リストの各要素に別々に作用することができるように設定されている.ただし,このことは関数によっては当てはまらないときがある.ユーザ定義の関数 f は,それに対して特別な設定がなされない限り,リスト全体にしか作用しない.ユーザ定義の関数をリストの各要素にも適用可能にするには,「リストや式への関数の部分的適用」と「構造操作」で説明するMapとThreadを使う必要がある.
Nをリストに作用させ,数値を確認する:
Tableで作ったリストには,別の演算を行うことも可能である:
これまで見てきた表の作成例は,すべて単一の表を変えて作成した.複数のパラメータに依存した表を作成することもできる,多次元の表を作るときも「和と積」の標準的な反復子の記述法が使われる.
これは,{1,2,3,4}からサンプルを取った4組の数のペアのリストを与える.Tableは,リストの各要素についてRandomSample[{1,2,3,4},2]の評価を行う.このため,4つの異なるサンプルが得られる:
Tableを使って任意次数の配列を生成することができる.
Table[f,{imax}] | f を imax 回計算し,値をリストとして構成する |
Table[f,{i,imax}] | i が1から imax までの間での f の値のリストを構成する |
Table[f,{i,imin,imax}] | i が imin から imax までの間での値のリストを構成する |
Table[f,{i,imin,imax,di}] | 刻み幅 di を使う |
Table[f,{i,imin,imax},{j,jmin,jmax},…] | 多次元の表を生成する |
Table[f,{i,{i1,i2,…}] | i が連続的に値 i1, i2, …を取る f の値のリストを構成する |
TableForm[list] | リストを表形式で表示する |
「リスト要素の操作」で説明した操作法でリストから任意の要素を抽出することができる.
t[[i]] or Part[t,i] | リスト t の i 番目のサブリストを抽出する(t〚i〛とも入力する) |
t[[i;;j]] or Part[t,i;;j] | リスト t の i 番目から j 番目までの要素のリストを与える |
t[[{i1,i2,…}]] or Part[t,{i1,i2,…}] | リスト t の i1番目,i2番目…の要素のリストを与える |
t[[i,j,…]] or Part[t,i,j,…] | リスト t の t[[i]][[j]]…に対応する部分を与える |
「リスト要素の操作」で述べたように,Wolfram言語においてリストは配列と同じように扱うことができる.例えば,リストのリストは二次元配列である.それを表形式でレイアウト表示したなら,各要素に割り当てられた2つの添数は, と の座標のような働きをする.
{a,b,c} | リストの定義(中カッコで要素をくくる) |
Part[list,i] or list[[i]] | リストの部分抽出(単一要素).リスト list の i 番目の要素を抽出する(第1要素は list[[1]]) |
Part[list,{i,j,…}] or list[[{i,j,…}]] | リストの部分抽出(複数要素).リスト list の i, j, …番目の複数要素からなる新たなリストを構成する |
Part[list,i;;j] | list の i 番目から j 番目までの要素のリスト |
Part[v,i] or v[[i]] | リストの部分抽出.リストから i 番目の要素を抽出する |
Part[v,i]=value or v[[i]]=value | リストの部分的割当て.i 番目の要素に値を割り当てる |
Table[f,{i,n}] | i=1,2,…,n で f を計算し,n 次元ベクトルを作成する |
Array[a,n] | {a[1],a[2],…}要素からなる n 次元ベクトルを作成する |
Range[n] | リスト{1,2,3,…,n}を構成する |
Range[n1,n2] | リスト{n1,n1+1,…,n2}を構成する |
Range[n1,n2,dn] | リスト{n1,n1+dn,…,n2}を構成する |
list[[i]] or Part[list,i] | list の i 番目の要素を抽出する |
Length[list] | list のリスト長(構成成分の個数)を得る |
c v | ベクトルをスカラー倍する |
a.b | 2つのベクトルの内積 |
Cross[a,b] | 2つのベクトルの外積(a×b としても入力可) |
Norm[v] | ベクトルのユークリッドノルム |
Table[f,{i,m},{j,n}] | i が1 〜m,j が1〜n の区間で f を計算し,m×n 要素の行列を作る |
Array[a,{m,n}] | i,j 要素 a[i,j]で m×n 要素の行列を作る |
IdentityMatrix[n] | n×n 要素の単位行列を作る |
DiagonalMatrix[list] | list の対角要素から正方行列(対角行列)を作る |
list[[i]] or Part[list,i] | 行列 list の i 番目の行を抽出する |
list[[All,j]] or Part[list,All,j] | 行列 list の j 番目の列を与える |
list[[i,j]] or Part[list,i,j] | 行列 list の i,j 列の要素を抽出する |
Dimensions[list] | list で与えられる行列の次元数を調べる |
Column[list] | list の要素を列に表示する |
MatrixForm[list] | 行列形式で list を表示する |
c m | 行列のスカラー倍 |
a.b | 2つの行列のドット積 |
Inverse[m] | 逆行列 |
MatrixPower[m,n] | 行列の n 番目のベキ |
Det[m] | 行列式 |
Tr[m] | 対角和(トレース) |
Transpose[m] | 転置行列 |
Eigenvalues[m] | 固有値 |
Eigenvectors[m] | 固有ベクトル |
Eigenvaluesを使うと,行列の固有値を計算することができる:
上記の関数の他に,行列演算のための組込み関数がまだいろいろあるが,それらは,「Wolfram言語における線形代数」で説明する.
First[list] | リスト list の1番目の要素を抽出する |
Last[list] | リストの最後の要素を抽出する |
Part[list,n] or list[[n]] | リストの n 番目の要素を抽出する |
Part[list,-n] or list[[-n]] | リストの後ろから数えて n 番目の要素を抽出する |
Part[list,m;;n] | 要素 m から n を抽出する |
Part[list,{n1,n2,…}] or list[[{n1,n2,…}]] | |
n1, n2, …番目の要素を抽出したリストを作成する |
Take[list,n] | リスト list で前から n 個の連番要素を抽出し,リストに構成する |
Take[list,-n] | リストで後ろから n 個の連番要素を抽出し,リストに構成する |
Take[list,{m,n}] | リストで m 番目から n 番目までの連番要素を抽出し,リストに構成する |
Rest[list] | リスト list から先頭要素を除いたリストを作る |
Drop[list,n] | リスト list から初めの n 個の要素を除いたリストを作る |
Most[list] | リスト list から最終要素を除いたリストを作る |
Drop[list,-n] | リスト list から後ろの n 個の要素を除いたリストを作る |
Drop[list,{m,n}] | リスト list の m 番目から n 番目の要素を除いたリストを作る |
「式のリスト的操作」で詳しく説明するが,ここで見てきた部分抽出の関数は,一般化することでリストだけでなく他のどんな式にも適用することができる.
ここで取り上げた関数は,リスト中の位置関係に基づいて要素を取り出すためのものである.「パターンにマッチする式の検索」で説明するが,SelectやCases等の関数を使えば,要素の位置関係ではなく,要素の特徴に基づいた抽出や検索もできるようになっている.
Position[list,form] | リスト list の中で form が現れる位置を探す |
Count[list,form] | リストlist の中で form が現れる回数を検索 |
MemberQ[list,form] | form がリスト list に含まれるかどうかを判定 |
FreeQ[list,form] | form がリスト list に含まれないかどうかを判定 |
「部分リストの構成」では位置関係や添数に従いリスト要素をどう抽出するかを説明している.ここでは,要素の持つ値に基づいて要素の検索や判定をどう行うかを説明する.
「パターンにマッチする式の検索」で説明してあるように,CountとPosition,およびMemberQとFreeQの関数を使うことで,任意のリスト要素を検索することはもちろん,特定の「パターン」に合った要素のクラスを探すこともできる.
Prepend[list,element] | リスト list に要素 element を第1要素として追加する |
Append[list,element] | リスト list に要素 element を最終要素として追加する |
Insert[list,element,i] | リスト list の前から数えた位置 i に要素 element を挿入する |
Insert[list,element,-i] | リスト list の後ろから数えた i 番目の位置に要素 element を挿入する |
Riffle[list,element] | リスト list の要素の間に element を挿入する |
Delete[list,i] | リスト list の位置 i の要素を削除する |
ReplacePart[list,i->new] | list 中の位置 i にある要素を new で置き換える |
ReplacePart[list,{i,j}->new] | list[[i,j]]を new で置き換える |
ReplacePartのような関数は明示的なリストを取って新たなリストを与える.しかし,場合によってはリストに「その場で」変更を加え,新たなリストは生成したくない場合もあるだろう.
m[[i,j]]=new | 行列の(i,j) 番目の要素を置換する |
m[[i]]=new | i 番目の行を置換する |
m[[All,i]]=new | i 番目の列を置換する |
Join[list1,list2,…] | リストを連結する |
Union[list1,list2,…] | リストを結合し,重複する要素を除去して,順序正しく並べ替えたリストを構成する |
Riffle[list1,list2] | list1と list2の交互的要素 |
Joinを使うと,リストをいくつでもつなぎ合せることができる:
Unionを使うと重複を解消してリストを結合できる:
Riffleは要素を交互にしてリストを結合する:
Union[list1,list2,…] | 入力リスト listi を結合し,重複する要素があれば解消して順序正しく並べ替えたリストを構成する |
Intersection[list1,list2,…] | すべての入力リスト listi に共通する要素でリストを構成する |
Complement[universal,list1,…] | すべての入力リスト listi にない入力リスト universal の要素でリストを構成する |
Subsets[list] | list のすべての部分集合を与える |
DeleteDuplicates[list] | list から重複する要素をすべて削除する |
Unionを使うと,入力リストの和集合を作ることができる:
Intersectionで入力リストの共通集合を作る:
Complementを使い,最初の集合から他の集合を引いた補集合を構成する:
DeleteDuplicatesはリストから重複する要素をすべて削除する:
Sort[list] | 入力リスト list を標準的順序(小から大の数字,アルファベット順等)に並べ替えたリストを構成 |
Union[list] | 入力リスト list で重複する要素があったらその重複を解消して標準的順序に並べ替えたリストを構成 |
Reverse[list] | 入力リスト list の要素の並ぶ順序を反転させたリストを構成 |
RotateLeft[list,n] | リスト list の全要素を n 回左方向に位置を入れ替えた(左回転させた)リストを構成 |
RotateRight[list,n] | リスト list の全要素を n 回右方向に位置を入れ替えた(右回転させた)リストを構成 |
右方向の回転を命令するには,回転数に負の値を指定するか,RotateRightを使う:
Partition[list,n] | 入力リスト list の全要素を n 個ずつのサブリストに分割したリストを構成する |
Partition[list,n,d] | d をオフセットとする部分リストを構成する |
Split[list] | 入力リスト list を同一要素ごとにまとめて分けたリストを構成する |
SplitBy[list,f] | f が適用されたときに,list を同じ値の要素からなるサブリストに分割する |
Gather[list] | list の要素を同一要素ごとに集めたサブリストにする |
GatherBy[list,f] | list 中の要素を,f を適用したときに同じ値を返す要素ごとのサブリストにする |
Sort[list] | list 中の要素を順に並べる |
Ordering[list] | Sort[list] における list 中の要素の位置 |
Ordering[list,n] | Ordering[list] 中の最初の n 個の要素の位置 |
Ordering[list,-n] | Ordering[list] 中の最後の n 個の要素の位置 |
Permutations[list] | list の可能な全順序 |
Min[list] | list の最小要素 |
Max[list] | list 中の最大要素 |
これはSort[t]に等しい:
Flatten[list] | 多次元リスト list のすべてのレベルのネストを外す |
Flatten[list,n] | 入力リスト list において,レベル1からレベル n までのサブリストのネストを外す |
Partition[list,{n1,n2,…}] | 入力リスト list をサイズ n1×n2×…のブロックに分割する |
Transpose[list] | リストの最上層の2つのレベルを入れ替える |
RotateLeft[list,{n1,n2,…}] | 後続するレベルを位置 ni 分ずらす |
PadLeft[list,{n1,n2,…}] | 長さが ni になるように後続するレベルを充填する |
上記の他にも,各種の多次元リストの操作が可能である.それらのいくつかに関しては「リストの操作」で触れる.