おっぱいそん!

pythonを数値計算に使うときのテクニックとかをまとめていきたい。

Fancy Indexing:配列の一部を条件をつけて取り出す

aを適当なN次元配列とする。
a[a_1, a_2, a_3, ]とすると、配列の1つの成分を取り出せる。
a[リスト]とすると、1次元配列のリスト番目の成分のみ取り出した配列を返す。
(上の用に配列の1つの成分だけ取り出したい時にはtuple(リスト)のようにtupleにして渡せば良い)
a[リスト1,リスト2,リスト3, ]とすると、1次元目をリスト1で2次元目をリスト2で、といったように取り出した配列を返す。
np.ix_をつかってa[np.ix_([行],[列])]とすると行列の一部の行と列のみ取り出した新しい行列を作れる。
※ここまでのリストは配列にしても同じ。
同じことをbool値を使って、a[[行のbool],[列のbool],[3次元目のbool], ]とも出来る(これはリストにすると、False=0, True=1と解釈されるので注意)。

import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print a[1,2]
print a[[1,2]]
print a[[1,2],[0,2]]
print a[np.ix_([1,2],[0,2])]
print a[np.array([False,True,True]),np.array([True,False,True])]

[[1 2 3]
[4 5 6]
[7 8 9]]
6
[[4 5 6]
[7 8 9]]
[4 9]
[[4 6]
[7 9]]
[4 9]

http://ibisforest.org/index.php?python%2Fnumpy#l9d00f8f

Numpyの配列(array)の一部を条件をつけて取り出す方法
import numpy as np
A = np.arange(10,0,-1)
print A>5
print np.where(A>5)
print A[A>5]**2
print A[np.where(A>5)]**2

[ True True True True True False False False False False]
(array([0, 1, 2, 3, 4]),)
[100 81 64 49 36]
[100 81 64 49 36]

配列に対して、論理式(>とか)を使うと、bool型(True or False)の配列を作ってくれる。
それを配列の引数として入れることで、配列の条件を満たす部分だけ取り出せる。
np.whereは基本的にタプルで条件が真の成分の場所を返す(返す値を別のものに指定も出来る)。
np.where(A>5)[0]とすれば、成分の場所を表すリストのみ渡してくれる。

【2014.10.23 追記】
2次元配列の例を追加しておく。

A = np.arange(9).reshape(3,3)
print A
print A>4
print np.where(A>4)
print A[A>4] # or A[np.where(A>4)]

[[0 1 2]
[3 4 5]
[6 7 8]]
[[False False False]
[False False True]
[ True True True]]
(array([1, 2, 2, 2]), array([2, 0, 1, 2]))
[5 6 7 8]

やはり、論理式は同じ形の配列で、成分がbool型のものを返す。
一方、np.whereはTrueの成分の場所を返す。今の場合は、Trueが4つあり、2次元配列なので、1つの成分の場所を指定するのに2つの数字がいるので、合計で8つの数字が並んでいる。
元の配列に論理式 or np.whereを入れると、元の配列が2次元でも、1次元配列として返す。

参考:
http://seesaawiki.jp/met-python/d/array
http://rest-term.com/archives/2999/
上の2つのサイトは配列の扱いに詳しい。
ひと通り読むといいかも。
http://d.hatena.ne.jp/nishiohirokazu/20111118/1321611727
http://www.geopacific.org/opensourcegis/python/python_raster