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])