はじめに
numpyは配列演算を高速に行うことができるpythonのライブラリです。
import numpy as np
通常は上のようにimportし、npと略記してスクリプト内で呼び出します。
np.arrayをうまく使えると、シンプルで速いスクリプトを書けるため、積み重ねていくと良いと思います。
np.intersect1d
今回のメインは、複数の集合の共通部分の抽出です。各集合は、np.array型の一次元の配列で表してあるものとします。
最も単純には、以下のような挙動をします。
array_1 = np.array([1, 2, 3, 4, 5])
array_2 = np.array([1, 3, 5, 7, 9])
In: np.intersect1d(array_1, array_2)
Out: array([1, 3, 5])
3つ以上の配列を引数にそのまま渡すことはできません。以下のようにfunctools.reduceを活用します。
In: reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
Out: array([3])
注意が必要なのは、intersect'1d'である点です。2次の配列を渡すと、以下のように一次元配列に勝手に直した後で、共通部分を返します。
array_2d_1 = np.array([[1, 'b'], [3, 'b'], [4, 'a']])
array_2d_2 = np.array([[2, 'b'], [3, 'c'], [4, 'a']])
In: np.intersect1d(array_2d_1, array_2d_2)
Out: 〇 array(['3', '4', 'a', 'b'], dtype='<U21')
× array([[4,'a']], dtype='<U21')
おまけ
2次以上の配列の共通部分を求める方法としては、
一度各行の要素を一つのセットオブジェクトに変換してnp.intersect1d()を用いる
があります。
こちらを参考にしてください。(https://stackoverflow.com/questions/8317022/get-intersecting-rows-across-two-2d-numpy-arrays)