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