Python
numpy
pyhon3

Numpyのファンシーインデックス(Fancy Index)で配列を自由に操作する

やりたいこと

Numpyのndarrayに備え付けられているファンシーインデックスという機能を使ってリストより自由に配列を操作してみる

環境

  • Python3.6.3
  • Linux Mint MATE 18

ファンシーインデックスとは何か

文章で説明するより例を見せたほうが早いので、下に簡単な例を示します。

import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
a[[0,1]]

#[[1,2,3],
# [4,5,6]]

普通はarrayの要素を指定するときにはa[0][1]などと[]内に整数で指定します。しかしファンシーインデックスでは[]内に配列を入れて指定することができます。

上の例ではa[[0,1]]a[0]a[1]を取り出すことを意味しています。これくらい簡単な例だとa[:2]でより簡単に表せます。しかし次のような例を見てみると、ファンシーインデックスの便利さが解ると思います。

a[[0,2]] -> [[1,2,3],[7,8,9]] #a[0]とa[2]を取り出す
a[[0,3]] -> [[1,2,3],[10,11,12]] #a[0]とa[3]を取り出す

もっと柔軟に使う

ファンシーインデックスは各要素を狙い撃ちすることもできます。

import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
a[[0,1],[2,2]]

#[3,6]

上の例ではa[0,2]要素と[1,2]要素のみを抜き出して新たな配列を作っています。

さらに、抜き出すという使い方の他に、列を入れ替えるという目的にも使えます。

a[[3,1,2,0]]
#[[10,11,12],
# [4,5,6],
# [7,8,9],
# [1,2,3]]

この例ではaの4行目と1行目を入れ替えています。これは行列の基本変形が必要なときに重宝しそうです。(ガウスの消去法とかでピボット選択とかで有用そう)

他にも、例えばリスト内包表記と組み合わせると偶数番目の要素(a[0],a[2])のみを取り出すこともできます。

a[[2*i for i in range(2)]]
#[[1,2,3],
# [7,8,9]]

filterなどの高階関数やlambda式と組み合わせればいろいろできそうです。