28
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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 にこんな使い方があるの初めて知った.

まとめ

より良い方法求む.

28
12
0

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
28
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?