Numpy で特定のインデックス以外の要素を取り出す

  • 5
    Like
  • 0
    Comment
More than 1 year has passed since last update.

R ユーザーならば,呼吸をするのと同じくらい当たり前な以下の操作.
これで特定の添字を除いた要素を抽出することができる.

vec <- 1:10
ind_rm <- c(5, 7)
# ind_rm 以外の index を指定して要素を取り出している
print(vec[-ind_rm])
[1]  1  2  3  4  6  8  9  10

案外 numpy だとスマートにやる方法がなかなか思いつかない.
皆結構困っているのではなかろうか.
自分だけだったら悲しい.

Numpy でやりたい

やはり R のように特定の要素以外という発想がそもそも間違っているっぽいので,素直に残す要素の添字を含む array もしくは list を上手に作る方法を考える.

素直にやるならこんな感じな気がするけれど,何か in とか明らかに無駄な計算している感が拭えない.

import numpy as np

vec = np.arange(10)
ind_rm = [5, 7]

# [0, 1, 2, 3, 4, 6, 8, 9] を作りたい!
ind = [i for i in range(10) if i not in ind_rm]

print vec[ind]

Stack overflow で調べてちょっと感心したのは以下のような方法.

import numpy as np

vec = np.arange(10)
ind_rm = [5, 7]

# [True, True, True, True, False, True, False, True, True, True] を作れば良いという方針
ind = np.ones(10, dtype=bool)
ind[ind_rm] = False

print vec[ind]

行数の節約にはならないけれど,こっちの方が無駄な計算がなくて若干速いっぽい.
np.ones にこんな使い方があるの初めて知った.

まとめ

より良い方法求む.