LoginSignup
13
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-20

やりたいこと

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式と組み合わせればいろいろできそうです。

13
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13