11
9

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] 2つのndarrayを比較する

Last updated at Posted at 2018-07-22

はじめに

各インデックスにおいて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 == bnp.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は便利。

11
9
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
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?