LoginSignup
10
4

More than 5 years have passed since last update.

numpy.arrayの共通集合の抽出で注意すること

Posted at

はじめに

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)

参考リンク

numpy全般

10
4
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
10
4