意味悲鳴

PythonとかUnityとか.技術ブログでしたが,研究ブログにシフトしました.

numpyのunravel_index()の挙動について

なんかわっかんねぇなぁと思ってたんですが,Jupyter使って実行してみたらなるほど!という感じだったのでメモしておく.

numpy.unravel_index — NumPy v1.10 Manual

扱うのはこの関数.パッと見訳わかりませんね.

n[15]: np.unravel_index(1, (7,6))
Out[15]: (0, 1)

これ,第一引数が返してほしいインデックスで,第二引数が行列の次元みたいです.

この場合,7*6の行列が存在して,そのうち1番目の要素のインデックスがほしい,と関数を呼んでいます.答えは0行目であり1列目の要素(0行目で0列目は0番目の要素みたいです).なので,返り値はTupleで(0,1)となっています.

で,この第一引数でリストを指定できるのですよ.これが便利なんだろうけど,帰ってわからなくなっていた.

In[21]: np.unravel_index([1], (7,6))
Out[21]: (array([0]), array([1]))

In[28]: np.unravel_index([0,1], (7,6))
Out[28]: (array([0, 0]), array([0, 1]))

おわかりいただけますかね.これ,リストで渡すと,それぞれを行と列で分けてarrayに入れて返してくれるんですよ.これだけだと誤解を生むと思うので,もうちょっと書いておくと,

In[29]: np.unravel_index([0,6], (7,6))
Out[29]: (array([0, 1]), array([0, 0]))

6番目の縦横のインデックスがほしいと投げられた時,6番目の要素は1行目の0番目にあります.この時,返り値には行のarrayの要素として1,列のarrayの要素として0が含まれているのがわかると思います.

こんな感じで,それぞれのarrayの要素としてインデックスが含まれています.これ,ちゃんと理解しないと大惨事を生みそう.

ダメ押しでもう一例だけだしておく.

In[31]: np.unravel_index([4,5,6], (7,6))
Out[31]: (array([0, 0, 1]), array([4, 5, 0]))

4番目の要素,5番目の要素,6番目の要素がそれぞれ行と列で見た時にどこにあるか(インデックス)が,行部分と列部分でわけて格納されて返ってきます.さすがに私も分かった.