SparseArray[{pos1v1,pos2v2,…}]
位置 posiの値 viを除いてすべての要素が0である疎な配列を与える.
SparseArray[list]
list の疎な配列版を与える.
SparseArray[data,{d1,d2,…}]
d1×d2×… 配列を表す疎な配列を与える.
SparseArray[data,dims,val]
指定されていない要素は値 val を持つと解釈される疎な配列を与える.
SparseArray
SparseArray[{pos1v1,pos2v2,…}]
位置 posiの値 viを除いてすべての要素が0である疎な配列を与える.
SparseArray[list]
list の疎な配列版を与える.
SparseArray[data,{d1,d2,…}]
d1×d2×… 配列を表す疎な配列を与える.
SparseArray[data,dims,val]
指定されていない要素は値 val を持つと解釈される疎な配列を与える.
詳細
- SparseArrayは疎な行列としても知られている.
- 疎な配列は,通常,ほとんどの項目が0の効率的な線形代数やグラフ隣接行列で使われる.
- 疎な配列は非零の値がある位置だけを保存するが配列全体を表す.
- data は次の形式でよい.
-
rules 位置と値を指定する規則 list 配列をSparseArray に変換する SymmetrizedArray[…] SparseArrayに変換する QuantityArray[…] QuantityのSparseArray に変換する SparseArray[…] 明示的な非零要素を最小にする - s=SparseArray[rules,…]のときは以下の指定を使うことができる.
-
{{i1 1,…,i1 r}v1,{i2 1,…,i2 r}v2,…} s[[i1 1, …, i1 r]]は値v1を,s[[i2 1, …, i2 r]]は値 v2を持つ等 pattv パターン patt に一致する{ik 1,…,ik r}すべてについて{{i1 1,…,i1 r}v,{i2 1,…,i2 r}v,…} patt:>v 一致する各位置について値 v を評価する Band[…]vals 帯と部分ブロックについて値を指定する {pos1,pos2,…}{v1,v2,…} {pos1v1,pos2v2,…}に等しい - 以下は,SparseArray変換である.
-
Normal[SparseArray[…]] 通常のList配列に変換する SymmetrizedArray[SparseArray[…]] 対称化された配列に変換する ArrayRules[SparseArray[…]] 規則のリスト{pos1->v1,pos2->v2,…}を与える - SparseArrayオブジェクトは通常の配列の表現なので,多くの関数が通常の配列と同じように扱う.例として,Dimensions,Part,Plus,LinearSolve等の関数が挙げられる.
- SparseArray[data,…]はSparseArray[Automatic,dims,val,…]という構造の最適化された標準形に常に変換される.
- SparseArrayは,AtomQのような関数によってあるいはパターンマッチングの目的では,生のオブジェクトとして扱われる.
- デフォルトで,SparseArrayは指定されていない要素 val は0であるとみなす.
- SparseArrayの要素は数値ではなくてもよいが,それ自体がリストであってはならない.
- SparseArray[…][prop]はSparseArrayオブジェクトの特性 prop を与える.次は,使用可能な特性である.
-
"ImplicitValue" 明示的には与えられていない要素の値を与える "ExplicitLength" 明示的な値の数を与える "ExplicitValues" 明示的な値のリストを与える "ExplicitPositions" 明示的な値に対応する位置のリストを与える "ColumnIndices" 圧縮された疎な行による表現からの列の指標を与える "RowPointers" 圧縮された疎な行による表現からの行のポインタリストを与える "BandWidth" 疎な行列についてのオフ対角帯幅を与える "Density" 要素の総数に対する明示的な値の割合を与える
例題
すべて開く すべて閉じる例 (1)
スコープ (7)
SparseArray[Table[{2 ^ i} -> 1, {i, 10}]]SparseArray[Table[{2 ^ i, 3 ^ i + i} -> 1, {i, 10}]]SparseArray[Table[{2 ^ i, 3 ^ i + i, i ^ 5} -> 1, {i, 10}]]s = SparseArray[{{i_, i_} -> -2, {i_, j_} /; Abs[i - j] == 1 -> 1}, {5, 5}]MatrixForm[s]s = SparseArray[{{i_, i_} -> -2, {i_, j_} /; Abs[i - j] == 1 -> 1}, {10 ^ 4, 10 ^ 4}]d = RandomReal[1, {100}];m = SparseArray[{i_, i_} :> d[[i]], Length[d]{1, 1}]これはDiagonalMatrixに等しい:
m == DiagonalMatrix[d]{ByteCount[m], ByteCount[DiagonalMatrix[d]]}Bandの規則を用いてブロック対角行列を作る:
s = SparseArray[Band[{1, 1}] -> {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}]MatrixForm[s]SparseArray[{{1, 0, 0}, {1, 2, 0}, {1, 2, 3}}]rules = Table[RandomInteger[{1, 2}, 4] -> i, {i, 10}]s = SparseArray[rules]Normal[%]ArrayRulesはSparseArrayを指定するのに必要最低限の規則のリストを作る:
ArrayRules[s]多くの一般的な演算では,SparseArrayオブジェクトはそれと同等のリストと同じように扱われる:
m1 = SparseArray[{{i_, i_} -> -2, {i_, j_} /; Abs[i - j] == 1 -> 1}, {5, 5}];
m2 = SparseArray[{{i_, i_} -> 1}, {5, 5}];Map[MatrixForm, {m1, m2}]MatrixForm[m1 + 2 m2]行列の積はDotで計算される:
MatrixForm[m1.m1]LinearSolve[N[m1], {0, 1, 2, 1, 0}]Map[f, m1, {2}]MatrixForm[%]一般化と拡張 (2)
s = SparseArray[{i_, i_} -> y, {3, 3}, x]MatrixForm[s]ns = SparseArray[{{i_, i_} -> -2., {i_, j_} /; Abs[i - j] == 1 -> 1.}, {5, 5}, 0.]MatrixForm[ns]s = SparseArray[{{i_, i_} -> -2, {i_, j_} /; Abs[i - j] == 1 -> 1}, {5, 5}]N[s]はnsに等しい:
SameQ[ns, N[s]]アプリケーション (4)
Normal[SparseArray[10 -> 1, 19]]Normal[SparseArray[{3, 3} -> 1, 5]]ListLinePlot[SparseArray[{1 -> 2, 10 -> 7, 3 -> 2}]]s = SparseArray[{{i_, j_} /; Mod[2i + j, 7] == 1 -> 1}, {20, 20}]GraphPlot[s]n = 1000;
h = 1. / n;
xgrid = h Range[1, n];
f[x_] := 1 + 100 Exp[-(321(x - 1 / 2)) ^ 2];
g[x_] := Sin[Pi x];id = SparseArray[{i_, i_} -> 1., {n, n}, 0.];
d2 = SparseArray[{{i_, i_} -> -2., {n, n - 1} -> 2., {i_, j_} /; Abs[i - j] == 1 -> 1.}, {n, n}, 0.]u = LinearSolve[d2 / h ^ 2 + id f[xgrid], g[xgrid]];ListPlot[Transpose[{xgrid, u}]]特性と関係 (3)
SparseArrayオブジェクトは対応する一般的なリストに等しい(Equal):
s = SparseArray[{{1, 2} -> 3, {4, 5} -> 6}]s == Normal[s]式の構造が異なるので,これらはSameQではない:
s === Normal[s]SparseArrayオブジェクトと使われる関数 f については,一般に f[s]==f[Normal[s]]である:
s = SparseArray[RandomInteger[{1, 100}, {1000, 2}] -> RandomReal[1, 1000]]Transpose[s] == Transpose[Normal[s]]s.s == Normal[s].Normal[s]これは,属性がListableのすべての関数を含む:
listable = Map[ToExpression, Cases[Names["System`*"], s_String /; MemberQ[Attributes[s], Listable]]];f = First[RandomChoice[listable, 1]]f[s] == f[Normal[s]]CoefficientArraysを使って線形の式をSparseArrayオブジェクトに変換する:
expr = ListCorrelate[{1, 2, 1}, Array[x, {100}], {2, 2}]; Short[expr]{v, m} = CoefficientArrays[expr, Array[x, {100}]]Dotを使ってSparseArrayから式に変換する:
m.Array[x, {100}]//Short考えられる問題 (9)
SparseArrayの規則のリストである位置が繰り返される場合は,最初のものが使われる:
SparseArray[{{1, 1} -> 1, {1, 1} -> 2}]//NormalSparseArray[{{i_, i_} -> 1, {1, 1} -> 2}]//NormalSparseArrayオブジェクトは,一般の形式では表現できないほど大きいデータでも表すことができる:
s = SparseArray[{{i_, i_} -> i}, {100000, 100000}]Normalを使うとSystemExceptionが返される:
Normal[s]s = SparseArray[{{i_, i_} -> 1, {i_, j_} /; Abs[i - j] == 1 -> 1}, {3, 3}]r = s.s - 2sMatrixForm[r]SparseArrayを使って疎な構造を再計算する:
SparseArray[r]SparseArray表現の内部構造は一意的ではなく,SameQはこれを検出する:
s1 = SparseArray[{1, 1} -> 1, {2, 2}];
(s1 - s1) === SparseArray[{}, {2, 2}]SparseArrayを使って疎な構造を再計算する:
SparseArray[s1 - s1] === SparseArray[{}, {2, 2}]Equalが予想通りに動作することに注意のこと:
(s1 - s1) == SparseArray[{}, {2, 2}]SparseArray表現の内部構造は一意的ではなく,部分的な設定でその構造が変わる可能性がある:
s1 = SparseArray[{{3}, {5}} -> 1, {6}];
s2 = SparseArray[{{5}} -> 1, {6}];
s2[[3]] = 1;SparseArrayの例が等しいかどうかをテストする:
s1 === s2SparseArrayを使って疎な構造を再計算する:
s1 === SparseArray[s2]Equalが予想どうりに動作する点に注意のこと:
s1 == s2副次的な影響のある操作をSparseArrayに繰り返し使うと異なる結果が返されることがある:
s = SparseArray[{{1} -> 2, {4} -> 3}]Module[{i = 1}, Scan[i++&, s];i]Module[{i = 1}, Scan[i++&, Normal[s]];i]ReapとSowを使ってどの要素がアクセスされているかを見ることができる:
Reap[Map[Sow, s]]Reap[Map[Sow, Normal[s]]]SparseArrayオブジェクトについて,Partは表されたリストの部分を返す:
s = SparseArray[{i_} -> i, {5}]Part[s, 1]FullFormは基本的な保存情報からオブジェクトを再構成する方法である:
FullForm[s]表現に作用しない関数については,SparseArrayオブジェクトは原子的なものとして扱われる:
s = SparseArray[{i_, i_} -> i, {5, 5}]表示された行列にはCasesは使えない:
Cases[s, i_ /; i > 0, Infinity]Cases[Normal[s], i_ /; i > 0, Infinity]ArrayRulesの結果を使って展開せずに情報を得られることがよくある:
Cases[ArrayRules[s], (p_ -> i_ /; i > 0) -> i, 1]密なSparseArrayの場合でも,0による除算が可能なことがある:
s = SparseArray[{{2, 1}, {1, 2}}]1 / sSparseArrayの密度は1である:
s["Density"]密度が1なので,このSparseArrayは非常に特殊なケースであり,この作業を行うには計算量が膨大になる.この場合は行列が密なのでNormalの使用が正当化される:
1 / Normal[s]おもしろい例題 (1)
SetAttributes[cellupdate, Listable];
cellupdate[1, 2] = cellupdate[_, 3] = 1;
cellupdate[_, _] = 0;update[m_] := cellupdate[m, Sum[RotateRight[m, r], {r, {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}}]]Block[{n = 100, m = 10, h}, h = Floor[n / 2 - m / 2];s = SparseArray[Band[{h, h}] -> RandomInteger[1, {m, m}], {n, n}]];
Table[ArrayPlot[Do[s = update[s], {10}];s = SparseArray[s]], {8}]テクニカルノート
関連するガイド
-
▪
- 疎な(スパース)配列 ▪
- 行列の構成 ▪
- 行列と線形代数 ▪
- リストの構築 ▪
- テンソル ▪
- グラフと行列 ▪
- ベクトル操作 ▪
- 構造化行列とたたみ込みカーネル ▪
- 3D画像 ▪
- リスト操作 ▪
- データの配列の操作 ▪
- 系のモデル化 ▪
- 線形・非線形フィルタ
関連するワークフロー
- 行列を作成する
履歴
2003 で導入 (5.0) | 2007 で更新 (6.0) ▪ 2021 (13.0)
テキスト
Wolfram Research (2003), SparseArray, Wolfram言語関数, https://reference.wolfram.com/language/ref/SparseArray.html (2021年に更新).
CMS
Wolfram Language. 2003. "SparseArray." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2021. https://reference.wolfram.com/language/ref/SparseArray.html.
APA
Wolfram Language. (2003). SparseArray. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/SparseArray.html
BibTeX
@misc{reference.wolfram_2026_sparsearray, author="Wolfram Research", title="{SparseArray}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/SparseArray.html}", note=[Accessed: 14-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_sparsearray, organization={Wolfram Research}, title={SparseArray}, year={2021}, url={https://reference.wolfram.com/language/ref/SparseArray.html}, note=[Accessed: 14-November-2026]}