概要
numpy.where()
関数の主な使い方は以下の通り。
- 配列の要素のうち条件に合う要素のインデックスを取り出す
- 配列の要素の条件によって、2つの配列のいずれかの要素を割り当てる
基本的な挙動
条件に応じた値の取り出し
以下のように、3項演算子と同じように使える。
1 2 3 4 5 |
print(np.where(True, "T", "F")) ♯T print(np.where(False, "T", "F")) # F |
True
/False
の代わりに数値でも可。
1 2 3 4 5 |
print(np.where(1, "T", "F")) # T print(np.where(0, "T", "F")) # F |
bool
配列によるインデックスの取り出し
bool
配列を引数に渡すと、True
要素のインデックスの配列を返す。True
/False
の代わりに数値でも可。
1 2 3 4 5 |
print(np.where([True, False, False, True])) # (array([0, 3], dtype=int32),) print(np.where([1, 0, 0, 1])) # # (array([0, 3], dtype=int32),) |
bool
配列と同じ形の2つの配列を引数に加えると、bool
配列の要素のTrue
/False
に応じて、1つ目の配列/2つ目の配列の要素が取り出されて並べられた配列が返される。
1 2 3 4 5 |
print(np.where([True, False, False, True], [1, 2, 3, 4], ["A", "B", "C", "D"])) # ['1' 'B' 'C' '4'] print(np.where([1, 0, 0, 1], [1, 2, 3, 4], ["A", "B", "C", "D"])) # ['1' 'B' 'C' '4'] |
上の例では、True
(1)が0番目と3番目、False
(0)が1番目と2番目にあるので、戻り値の配列の0番目と3番目には2つ目の配列の対応する要素、1番目と2番目には3つ目の配列の対応する要素があてられている。
利用法~条件に合う要素のインデックス
条件に合う要素が1つの場合
where()
関数の引数として、配列の要素に関する条件式を与えると、条件に合致する要素のインデックスが得ることができる。
ただし戻り値はタプルで、かつ2次元のタプルの第1要素にndarray
として納められている点に注意。
1 2 3 4 5 6 7 |
import numpy as np names = np.array(["JPN", "USA", "GBR", "FRA", "JPN", "KOR", "JPN", "CHN"]) print(np.where(names=="FRA")) # (array([3], dtype=int32),) |
そのndarray
は1つの要素を持ち、その値が"FRA"
のインデックスになっている。
1 2 3 |
print(np.where(names=="FRA")[0]) # [3] |
インデックスの数値を取り出したいときは、このndarray
の要素を取り出す。
1 2 3 |
print(np.where(names=="FRA")[0][0]) # 3 |
条件に合う要素が複数の場合
先の配列には"JPN"
が3つ含まれている。このように条件に合致する要素が複数ある場合は、インデックスが配列で返される。
ただしこの場合も戻り値は2次元のタプルで、その第1要素に目的の配列が格納されている。
1 2 3 |
print(np.where(names=="JPN")) # (array([0, 4, 6], dtype=int32),) |
インデックスの配列を利用する場合は、タプルの先頭要素を取り出す。
1 2 3 |
print(np.where(names=="JPN")[0]) # [0 4 6] |
条件に応じた配列の要素の選択
配列に対する条件式と、その条件の真偽に応じて選択される配列を引数に与える。文章にするとややこしいので、以下例示。
1 2 3 4 5 |
x = np.array([1, 2, 3, 4, 5]) y = np.array([10, 20, 30, 40, 50]) print(np.where(x % 2 == 1, x, y)) # [ 1 20 3 40 5] |
x
の各要素が基数の場合はx
から、偶数の場合はy
から、同じ位置にある要素が取り出されて結果の配列にセットされる。
以下はもう一つの例。
1 2 3 4 |
a = np.arange(10) print(np.where(a % 2 == 0, a / 2, (a - 1) / 2)) # [0. 0. 1. 1. 2. 2. 3. 3. 4. 4.] |
この例では条件、真の場合、偽の場合に同じ配列を使っている。条件の配列の要素が偶数の場合は、その要素の1/2、奇数の場合はその要素から1を引いて1/2にした数値を持つ配列が返される。その結果、同じ数が2つずつ並ぶ配列が得られる。