3.3 配列の特徴量

以下の3次元配列mについて考えよう。

   m ← 2‿3‿5⥊0
┌─
╎ 0 0 0 0 0
  0 0 0 0 0
  0 0 0 0 0

  0 0 0 0 0
  0 0 0 0 0
  0 0 0 0 0
            ┘

mには3つの軸があり、その全てを指定することで要素0にアクセスできる。 言葉を補って、

3軸(その定義域は\([0,2), [0,3), [0,5)\))を添字として1回指定することで要素を得る。

と言い換え、このことから、

  • 3軸あることからrank(=)を3
  • その定義域からshape()を⟨2, 3, 5⟩
  • 添字を1回指定することからdepth()を1

と表現する。

   =m    # rank
3
   ≡m    # depth
1
   ≢m    # shape
⟨ 2 3 5 ⟩

depth

要素がatomになってない以下の3次元配列nの形状について考える。

   n ← 2‿3‿5⥊<"abcdef"
┌─
╎ "abcdef" "abcdef" "abcdef" "abcdef" "abcdef"
  "abcdef" "abcdef" "abcdef" "abcdef" "abcdef"
  "abcdef" "abcdef" "abcdef" "abcdef" "abcdef"

  "abcdef" "abcdef" "abcdef" "abcdef" "abcdef"
  "abcdef" "abcdef" "abcdef" "abcdef" "abcdef"
  "abcdef" "abcdef" "abcdef" "abcdef" "abcdef"
                                               ┘

先ほどと同様にnに対して添字を1回指定することで要素"abcdef"にアクセスできるが。 これは文字列すなわち文字型の1次元配列である。 従って要素を得る過程は以下のように表現される。

3軸を1回指定することで配列の要素にアクセスできる。

   1‿1‿1⊑n
"abcdef"

さらに要素である文字列に対して1つの軸(その定義域は\([0,6)\))を1回指定することでatomである文字型データを得ることもできる。

   3⊑1‿1‿1⊑n
'd'
   1‿1‿1‿3⊑n           # 4次元配列ではない
Error: ⊑: Picking item at wrong rank (index 1‿1‿1‿3 in array of shape 2‿3‿5)
at 1‿1‿1‿3⊑n
          ^

そこで、配列の形状や添字は先のmと変わらないが、

  • 添字を最大2回指定できる(この時得られるデータはatomである文字型)ことからdepthは2

となる。

   =n    # rank
3
   ≡n    # depth
2
   ≢n    # shape
⟨ 2 3 5 ⟩
   ≡m    # depth of m
1

配列と文字列の間に単位配列が入っていて、そのことを考慮しなければいけないように思うかもしれない。 しかし、このnは文字列"abcdef"が入った単位配列をreshape()で2次元配列へ変換したものであり、nの中には単位配列は存在していない。 𝕨⥊<𝕩 は𝕩の入った単位配列を並べるためのideomではなく、(atomかどうかに関わらず)𝕩を並べるためのものである。

nが4次元配列にならない理由も𝕨⥊<𝕩という変換方法から来ている。 そうしたい場合には明示的に文字列をshape2‿3‿5‿6へreshape()することが必要なようである。

例1

=注釈
1010⟨⟩a base data type
<1011⟨⟩a unit array
7‿8‿9131⟨3⟩a list, 1D array
<7‿8‿9012⟨⟩a unit array of list
7‿8‿9≍7‿8‿9221⟨ 2 3 ⟩数値を要素に持つ2次元配列
⟨0⟩‿⟨1⟩‿⟨2⟩)≍(⟨0⟩‿⟨1⟩‿⟨2⟩)222⟨ 2 3 ⟩2次元配列の中に配列

例2: 要素の参照

    l ← ⟨0⟩‿⟨1⟩‿⟨2⟩)≍(⟨3⟩‿⟨4⟩‿⟨5⟩)
┌─
╵ ⟨ 0 ⟩ ⟨ 1 ⟩ ⟨ 2 ⟩
  ⟨ 3 ⟩ ⟨ 4 ⟩ ⟨ 5 ⟩
                    ┘
=返値
0⊏l132⟨3⟩⟨ ⟨ 0 ⟩ ⟨ 1 ⟩ ⟨ 2 ⟩ ⟩
0‿1⊏l222⟨ 2 3 ⟩これはビックリその1
1‿2⊑l111⟨ 1 ⟩⟨5⟩
2⊏1⊏l012⟨⟩これはビックリその2
⊑⊑2⊏1⊏l010⟨⟩5

これはビックリその1

1‿2は二つの軸を指定しているのではなく、範囲を指定している。

┌─
╵ ⟨ 0 ⟩ ⟨ 1 ⟩ ⟨ 2 ⟩
  ⟨ 3 ⟩ ⟨ 4 ⟩ ⟨ 5 ⟩
                      ┘

これはビックリその2

⊏は取り出さないのでunitになった

┌·
· ⟨ 5 ⟩
        ┘