NumPy: MaskedArrayで値の存在をチェック!ma.MaskedArray.__contains__()の使い方と代替方法


このメソッドは、以下の引数を取ります。

  • value: 検査対象の値

メソッドの戻り値は、以下のようになります。

  • False: 値がMaskedArray内に存在しない場合
  • True: 値がMaskedArray内に存在する場合
import numpy as np
import numpy.ma as ma

# 欠損値を含むMaskedArrayを作成
a = ma.array([1, 2, ma.masked, 4, 5])

# MaskedArray内に3が存在するかを検査
print(3 in a)  # True

# MaskedArray内に欠損値が存在するかを検査
print(ma.masked in a)  # True
  • 複数の次元を持つMaskedArrayに対して in 演算子を使用する場合は、各次元で検査が行われます。
  • 欠損値のマスクが True の場合、その値は in 演算子で検査しても見つかりません。
  • ma.MaskedArray.__contains__() メソッドは、numpy.ndarray.__contains__() メソッドと似ていますが、欠損値も考慮します。


例1:欠損値の有無を検査

import numpy as np
import numpy.ma as ma

# 欠損値を含むMaskedArrayを作成
a = ma.array([1, 2, ma.masked, 4, 5])

# MaskedArray内に3が存在するかを検査
print(3 in a)  # True

# MaskedArray内に欠損値が存在するかを検査
print(ma.masked in a)  # True

例2:2次元MaskedArray内の値を検査

import numpy as np
import numpy.ma as ma

# 欠損値を含む2次元MaskedArrayを作成
b = ma.array([[1, 2, ma.masked], [4, 5, ma.masked]])

# (2, 1) にある値が3であるかどうかを検査
print(3 in b[2, 1])  # True

# (1, 0) にある値が欠損値であるかどうかを検査
print(ma.masked in b[1, 0])  # True

例3:条件付きで値を検査

import numpy as np
import numpy.ma as ma

# 欠損値を含むMaskedArrayを作成
c = ma.array([1, 2, ma.masked, 4, 5])

# MaskedArray内に偶数があるかどうかを検査
def is_even(x):
  return x % 2 == 0

print(any(is_even(x) for x in a))  # True

これらの例は、ma.MaskedArray.__contains__() メソッドを使用して、さまざまな状況で値を検査する方法を示しています。

  • ユーザー定義の関数を使用して値を検査する
  • 文字列を含む値を検査する
  • 特定の範囲内の値を検査する


以下は、ma.MaskedArray.__contains__() の代替方法として使用できるいくつかの方法です。

numpy.any() を使用する

numpy.any() 関数は、配列内のすべての要素が False であるかどうかを検査します。これは、MaskedArray内のすべての値が欠損値であるかどうかを検査するために使用できます。

import numpy as np
import numpy.ma as ma

# 欠損値を含むMaskedArrayを作成
a = ma.array([1, 2, ma.masked, 4, 5])

# MaskedArray内に欠損値が存在するかどうかを検査
print(np.any(a.mask))  # True

numpy.sum() を使用する

numpy.sum() 関数は、配列内のすべての要素の合計を計算します。これは、MaskedArray内の欠損値の数をカウントするために使用できます。

import numpy as np
import numpy.ma as ma

# 欠損値を含むMaskedArrayを作成
a = ma.array([1, 2, ma.masked, 4, 5])

# MaskedArray内に欠損値が存在するかどうかを検査
print(np.sum(a.mask))  # 1

ループを使用する

最も基本的な方法は、ループを使用してMaskedArray内の各要素を検査することです。

import numpy as np
import numpy.ma as ma

# 欠損値を含むMaskedArrayを作成
a = ma.array([1, 2, ma.masked, 4, 5])

# MaskedArray内に3が存在するかを検査
found = False
for x in a:
  if x == 3:
    found = True
    break

print(found)  # True

カスタム関数を使用する

特定のニーズに合わせた検査を行う必要がある場合は、カスタム関数を作成できます。

import numpy as np
import numpy.ma as ma

def is_even_or_masked(x):
  return x % 2 == 0 or ma.is_masked(x)

# 欠損値を含むMaskedArrayを作成
a = ma.array([1, 2, ma.masked, 4, 5])

# MaskedArray内に偶数または欠損値が存在するかを検査
print(any(is_even_or_masked(x) for x in a))  # True

最適な方法の選択

使用する方法は、検査する値の種類、MaskedArrayのサイズ、およびパフォーマンス要件によって異なります。

  • 特定の条件に一致する値を検査する場合は、ループまたはカスタム関数を使用する必要があります。
  • 欠損値の有無を検査する場合は、numpy.any() または numpy.sum() を使用する方が効率的です。
  • 小さなMaskedArrayに対して単純な検査を行う場合は、ma.MaskedArray.__contains__() メソッドが最も効率的です。