はじめに
各インデックスにおいて1から9までの値をランダムに持つ大きさ100のndarrayを2つ生成してみる。
>>> import numpy as np
>>> a = np.random.randint(1, 10, 100)
>>> b = np.random.randint(1, 10, 100)
>>> a
array([3, 4, 7, 1, 6, 6, 9, 7, 7, 8, 9, 7, 9, 3, 5, 4, 6, 3, 5, 8, 3, 2,
9, 7, 7, 6, 1, 1, 2, 2, 8, 7, 1, 7, 1, 2, 9, 3, 3, 1, 6, 3, 3, 9,
1, 8, 7, 4, 3, 8, 5, 5, 6, 2, 7, 8, 3, 2, 9, 4, 6, 7, 1, 9, 3, 9,
8, 3, 4, 5, 9, 1, 4, 1, 6, 1, 6, 1, 1, 3, 2, 6, 8, 1, 1, 6, 5, 5,
5, 7, 9, 9, 3, 1, 2, 4, 6, 9, 6, 2])
>>> b
array([1, 1, 9, 5, 5, 3, 3, 4, 8, 4, 6, 1, 5, 3, 1, 1, 9, 6, 8, 8, 1, 2,
7, 6, 2, 5, 5, 2, 7, 8, 1, 3, 4, 9, 1, 2, 8, 5, 6, 9, 9, 3, 6, 4,
9, 6, 2, 5, 4, 2, 9, 6, 2, 2, 9, 9, 5, 4, 3, 1, 9, 2, 2, 6, 2, 7,
4, 2, 3, 2, 6, 5, 1, 2, 8, 4, 2, 4, 8, 5, 7, 4, 2, 6, 7, 7, 9, 1,
2, 8, 8, 9, 1, 7, 5, 4, 4, 9, 7, 7])
今回は、この2つのndarrayを比較して、値が等しくなっているインデックスの個数および値が等しくなっているインデックスの値を取得してみようと思う。
==
を使って2つのndarrayを比較したときの返り値について
実際に a == b
としてみると、
>>> a == b
array([False, False, False, False, False, False, False, False, False,
False, False, False, False, True, False, False, False, False,
False, True, False, True, False, False, False, False, False,
False, False, False, False, False, False, False, True, True,
False, False, False, False, False, True, False, False, False,
False, False, False, False, False, False, False, False, True,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, True, False, False, False, True, False, True, False,
False])
>>> type(a == b)
<class 'numpy.ndarray'>
このように値が等しいところはTrue
、値が異なるところにはFalse
が入ったndarrayが返ってきていることがわかる。
このndararyをうまく使って、値が等しくなっているインデックスの個数および値が等しくなっているインデックスの値を取得することができる。
np.sum()
を使って値が等しくなっているインデックスの個数を取得
通常、np.sum()
を使用すると、引数として与えられたndarrayのすべての要素の合計値が出力される。
>>> c = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> np.sum(c)
55
今回のポイントは、Falseは0、Trueは1として評価されることである。つまり、前述のa == b
をnp.sum()
の引数として与えると、Trueの数が返されるのである。
>>> np.sum(a == b)
10
今回、2つのndarrayにおいて10個のインデックスが同一の値を持っていることがわかった。
np.where()
を使って値が等しくなっているインデックスの値を取得
np.where()
を使うと、引数として与えられた条件を満たすインデックスが返される。
Falseは0、Trueは1として評価されることを思い出すと、
>>> np.where((a == b) == 1)
(array([13, 19, 21, 34, 35, 41, 53, 91, 95, 97]),)
こんな感じに書けることがわかる。
ちなみに、一発でnp.where(a == b)
でも良い。
>>> np.where(a == b)
(array([13, 19, 21, 34, 35, 41, 53, 91, 95, 97]),)
実際に、得られたindexにおける2つのndarrayの値を見てみると、
>>> for i in np.where((a == b) == 1)[0]:
... print(a[i], b[i])
...
3 3
8 8
2 2
1 1
2 2
3 3
2 2
9 9
4 4
9 9
確かに同じ値になっていることが確認できる。またその数は10個でnp.sum()
を使って求めた個数にも一致していることが確認できた。
おわりに
たとえばa == b
のところを a > b
にしたりするとaがbよりも大きい値を持っているインデックスの個数、値を取得できたりといろいろ応用が効く。numpyは便利。