NumPyには1次元のndarrayに対する集合関数がいくつも用意されている。
今回は基本的な集合関数の用途や使い方について説明しよう。
コンテンツ
重複要素を取り除くunique関数
集合関数の中でも最もよく使うのが、このunique関数だ。
ndarray配列から重複した要素を取り除き、ソートした結果を返すことができる。
なお、同様の処理はPython標準の関数でもおこなうことができる。
まずはそちらを見てみよう。
import numpy as np
names = np.array(['taro', 'jiro', 'taro', 'saburo', 'shiro', 'shiro'])
sorted(set(names))
# ['jiro', 'saburo', 'shiro', 'taro']
unique関数を使うと以下のように書くことができ、全く同じ結果を得られる。
import numpy as np
names = np.array(['taro', 'jiro', 'taro', 'saburo', 'shiro', 'shiro'])
np.unique(names)
# array(['jiro', 'saburo', 'shiro', 'taro'], dtype='<U6')
ソートされた結果については、以下のように数字を扱った例が分かりやすいだろう。
import numpy as np
ints = np.array([1, 1, 1, 3, 4, 2, 2, 3, 3, 5])
np.unique(ints)
# array([1, 2, 3, 4, 5])
二つの配列の共通する要素を取り出すintersect1d関数
intersect1d関数は引数に二つの配列を取り、共通する要素のみを取り出し、ソートした結果を得ることができる。
いわゆる積集合というものだ。
import numpy as np
ints1 = np.array([1, 1, 1, 3, 4, 2, 2, 3, 3, 5])
ints2 = np.array([3, 8, 7, 2, 2, 6])
np.intersect1d(ints1, ints2)
# array([2, 3])
二つの配列のどちらか一方にある要素を取り出すunion1d関数
union1d関数は二つの配列を引数に取り、少なくともどちらか一方に存在する要素を取り出し、ソートした結果を返す関数だ。
和集合といわれるものだ。
import numpy as np
ints1 = np.array([1, 1, 1, 3, 4, 2, 2, 3, 3, 5])
ints2 = np.array([3, 8, 7, 2, 2, 6])
np.union1d(ints1, ints2)
# array([1, 2, 3, 4, 5, 6, 7, 8])
配列xに配列yの要素が存在するかを判定するin1d関数
in1d関数はxとyの配列を引数に取り、第一引数に指定した配列内に、第二引数に指定した要素が含まれているかを順に判定していき、判定結果を真偽値配列で返す関数だ。
import numpy as np
ints1 = np.array([1, 1, 1, 3, 4, 2, 2, 3, 3, 5])
ints2 = np.array([3, 8, 7, 2, 2, 6])
np.in1d(ints1, ints2)
# array([False, False, False, True, False, True, True, True, True, False])
配列xから配列yに存在する要素を削除するsetdiff1d関数
setdiff1d関数は、第一引数に指定した配列内に、第二引数に指定した要素が含まれていれば、それを削除しソートした結果を返す関数だ。
これは差集合ともいう。
import numpy as np
ints1 = np.array([1, 1, 1, 3, 4, 2, 2, 3, 3, 5])
ints2 =np.array([3, 8, 7, 2, 2, 6])
np.setdiff1d(ints1, ints2)
# array([1, 4, 5])
配列xとyのうち、どちらか一方にのみ存在する要素を取り出すsetxor1d関数
setxor1d関数は、第一引数、第二引数に指定した配列のうち、どちらか一方にのみ存在する要素を取り出し、ソートした結果を返す関数だ。
これは排他的論理和とも言われ、どちらの配列にも存在する要素は削除される。
import numpy as np
ints1 = np.array([1, 1, 1, 3, 4, 2, 2, 3, 3, 5])
ints2 =np.array([3, 8, 7, 2, 2, 6])
np.setxor1d(ints1, ints2)
# array([1, 4, 5, 6, 7, 8])