疎な(スパース)配列:リストの操作

通常Wolfram言語ではリストは要素の明示的なリストを与えて指定する.しかし,大きな配列を扱っているような場合には,特定の位置における要素の値が何かだけを指定し,その他の要素はすべてデフォルト値(通常ゼロ)にすることができると便利なことがある.WolframシステムではSparseArrayオブジェクトを使ってこうすることができる.

{e1,e2,}, {{e11,e12,},}, 通常のリスト
SparseArray[{pos1->val1,pos2->val2,}]
疎な配列

通常のリストと疎な配列

疎な配列を指定する.
In[1]:=
Click for copyable input
Out[1]=
こちらは通常のリストである.
In[2]:=
Click for copyable input
Out[2]=
これは2次元の疎な配列を指定する.
In[3]:=
Click for copyable input
Out[3]=
これは通常のリストのリストである.
In[4]:=
Click for copyable input
Out[4]=
SparseArray[list]list の疎な配列版
SparseArray[{pos1->val1,pos2->val2,}]
位置 で値が である疎な配列
SparseArray[{pos1,pos2,}->{val1,val2,}]
同じ疎な配列
SparseArray[Band[{i,j}]->val]val である帯状疎配列
SparseArray[data,{d1,d2,}]××の疎な配列
SparseArray[data,dims,val]デフォルト値 val の疎な配列
Normal[array]array の通常のリスト版
ArrayRules[array]array の位置と値の規則

疎な配列の作成と変換

リストの疎な配列版を生成する.
In[5]:=
Click for copyable input
Out[5]=
通常のリストに変換し直す.
In[6]:=
Click for copyable input
Out[6]=
デフォルト値がで長さが7の疎な配列を作る.
In[7]:=
Click for copyable input
Out[7]=
これは上記に対応する通常のリストである.
In[8]:=
Click for copyable input
Out[8]=
これは疎な配列で使われた規則である.
In[9]:=
Click for copyable input
Out[9]=
帯行列を生成する.
In[10]:=
Click for copyable input
Out[10]//MatrixForm=

SparseArrayの重要な特徴は,位置の指定にパターンが使える点である.

に一致するすべての位置がである4×4の疎な配列を指定する.
In[11]:=
Click for copyable input
Out[11]=
結果は4×4の単位行列になる.
In[12]:=
Click for copyable input
Out[12]=
これは余分な要素を持った単位行列である.
In[13]:=
Click for copyable input
Out[13]=
こうすると第3列がすべてになる.
In[14]:=
Click for copyable input
Out[14]=

SparseArray[rules]は可能なすべての位置指定を取り,次に rules を適用して各々の値を決定するものであると考えることができる.例によってリストの最初で与えられた規則が最初に適用される.

ランダムな対角行列を生成する.
In[15]:=
Click for copyable input
Out[15]=
値が指標に依存する規則を使うことができる.
In[16]:=
Click for copyable input
Out[16]=
偶数位置にを挿入する.
In[17]:=
Click for copyable input
Out[17]=
代替値を含むパターンを使うことができる.
In[18]:=
Click for copyable input
Out[18]=
パターンに制約条件を付けることもできる.
In[19]:=
Click for copyable input
Out[19]=
こうすると帯対角行列ができる.
In[20]:=
Click for copyable input
Out[20]=
別の例である.
In[21]:=
Click for copyable input
Out[21]=

いろいろな目的のために,WolframシステムはSparseArrayオブジェクトをこれに対応する他の通常のリストと同じように扱う.このため,例えば疎な配列オブジェクトの部分を問うと,Wolframシステムは対応する通常のリストにおける部分について問われたかの如き処理をする.

これは疎な配列オブジェクトを生成する.
In[22]:=
Click for copyable input
Out[22]=
これは上記に対応する通常のオブジェクトである.
In[23]:=
Click for copyable input
Out[23]=
疎な配列の部分はこれに対応する通常の部分と同じである.
In[24]:=
Click for copyable input
Out[24]=
この部分はデフォルト値0である.
In[25]:=
Click for copyable input
Out[25]=

多くの操作でSparseArrayオブジェクトは通常のリストと同じように扱われる.可能な場合は結果として疎な配列が返される.

これは疎な配列を与える.
In[26]:=
Click for copyable input
Out[26]=
これは対応する通常のリストである.
In[27]:=
Click for copyable input
Out[27]=
Dotは疎な配列オブジェクトに直接働く.
In[28]:=
Click for copyable input
Out[28]=
疎な配列と通常のリストを混ぜることもできる.
In[29]:=
Click for copyable input
Out[29]=

Wolframシステムは疎な配列をSparseArrayという頭部を持つ式として表す.疎な配列は評価されると常にSparseArray[Automatic,dims,val,]という構造を持つ最適化された標準形に変換される.

しかしこの構造がはっきりすることはあまりない.Lengthのような操作でさえも結果は対応する通常のリストで与え,生のSparseArray式構造では与えないようになっているからである.

これは疎な配列を生成する.
In[30]:=
Click for copyable input
Out[30]=
これが根底にある最適化された式構造である.
Lengthは対応する通常のリストの長さを与える.
In[32]:=
Click for copyable input
Out[32]=
Mapもまた個々の値に働く.
In[33]:=
Click for copyable input
Out[33]=