1. ホーム
  2. python

[解決済み】np.unravel_indexの直感的な説明とは?

2022-01-31 13:31:17

質問

タイトルの通りなんですが ドキュメントを読み、しばらくこの機能で遊んでみましたが、この変換の物理的な表れが何であるかがわかりません。

どのように解決するのか?

コンピュータのメモリは線形にアドレス指定されています。各メモリセルは数字に対応しています。メモリのブロックは、その最初の要素のメモリアドレスであるベースと、アイテムのインデックスでアドレス指定することができます。例えば、ベースアドレスが10,000であると仮定します。

item index      0       1       2       3
memory address  10,000  10,001  10,002  10,003

多次元ブロックを格納するためには、その形状を何とかしてリニアメモリに収まるようにしなければなりません。そこで CNumPy これは行ごとに行われます。2Dの例は次のようになります。

  | 0      1      2      3
--+------------------------
0 | 0      1      2      3
1 | 4      5      6      7
2 | 8      9     10     11

つまり、例えばこの3×4ブロックでは、2Dインデックス (1, 2) は線形インデックスに対応する 6 というのは 1 x 4 + 2 .

unravel_index はその逆を行う。線形インデックスが与えられると、それに対応する ND のインデックスを表示します。これはブロックの寸法に依存するので、ブロックの寸法も渡さなければならない。つまり、この例では、元の2次元インデックスを得ることができます。 (1, 2) リニアインデックスから 6 :

>>> np.unravel_index(6, (3, 4))
(1, 2)

注:上記はいくつかの詳細について説明している。1) アイテムインデックスをメモリアドレスに変換する際、アイテムのサイズも考慮しなければならない。例えば、整数は通常4バイトまたは8バイトである。したがって、後者の場合、項目のメモリアドレスは i は次のようになります。 base + 8 x i . 2). NumPy は提案されたよりも少し柔軟です。それは ND のデータを、必要であれば列単位で表示します。メモリ上で連続していないデータでも、例えば隙間を空けて処理することができる。


ボーナス読み物 ndarrayの内部メモリレイアウト