[転載] numpy.ma詳細

参照リンク:Pythonのnumpy.asanyarray

numpy.ma 

numpy.maモジュール 

ファンダメンタル 

 

配列要素に欠落値または外れ値が含まれている場合、その配列はマスクされた配列と呼ばれます。numpy.maモジュールの動作方法は、次のように説明できます。数値配列のマスク要素をサポートします。 

マスクされた配列とは何ですか? 

 

多くの場合、データセットが不完全であるか、無効なデータが存在する可能性があります。たとえば、センサーには、特定の値に対して次の2つのストレージ条件がある場合があります。ストレージ障害と無効なデータのストレージです。numpy.maモジュールは、マスク配列を導入することでこの問題を解決するための便利な方法を提供します。マスク配列は、標準の多次元配列numpy.ndarrayとマスクの組み合わせです。マスクはnomaskのいずれかです。これは、マスクに関連する配列のすべての値が有効であることを意味します。ブール値の配列であり、連想配列の各要素値が有効かどうかを判断するために使用されます。マスク内の要素がFalseの場合、連想配列の対応する要素は有効です。つまり、マスクされていないと見なされます。マスク内の要素の値がTrueの場合、連想配列の対応する要素は無効です。つまり、マスクされていると見なされます。このパッケージは、マスクアイテムが計算に参加しないことを保証できます。誰もが直感的に理解できるように、次の例を示します。 

numpyをnpとしてインポート

numpy.maをmaとしてインポートします

x = np.array([1、2、3、-1、5]) 

 

x配列の4番目の値を無効なデータとしてマークします。最も便利な方法は、マスクされた配列を作成することです。 

mx = ma.masked_array(x、mask = [0、0、0、1、0]) 

 

これで、外れ値-1を考慮せずに、配列xの平均を計算できます。 

print( '[1、2、3、5]の平均値のみを計算し、計算結果は次のようになります:{}'。format(mx.mean())) 

[1、2、3、5]の平均値を計算するだけで、計算結果は2.75になります。 

numpy.maモジュール 

numpy.maモジュールの主な機能は、多次元配列numpy.ndarrayのサブクラスであるMaskedArrayクラスです。マスクされた配列のプロパティとメソッドは、MaskedArrayクラスで詳しく説明されています。numpy.maモジュールは、numpyパッケージの補足として使用できます。 

numpyをnpとしてインポート

numpy.maをmaとしてインポートします 

 

次のように、無効な2番目の要素を含む配列を作成できます。 

y = ma.array([1、2、3]、マスク= [0、1、0]) 

 

1.e20に近いすべての値が無効であるマスクされた配列を作成できます: 

z = ma.masked_values([1.0、1.e20、3.0、4.0]、1.e20) 

マスクされた配列を作成するその他の方法については、マスクされた配列の作成を参照してください。 

numpy.maを使用する 

マスクされた配列を作成する 

 

マスクされた配列を作成する方法はいくつかあります。 

最初の方法は、MaskedArrayクラスを直接呼び出すことです。2番目の方法は、2つのマスクされた配列コンストラクターarrayとmasked_arrayを使用することです。 

  array(data [、dtype、copy、order、mask、…]):マスク値を定義する配列クラスmasked_array:MaskedArrayと同じ。3番目の方法は、既存の配列のビューを取得することです。この場合、配列に名前付きフィールドがない場合、または配列と同じ構造のブール配列がない場合、ビューのマスクはnomaskに設定されます。 

x = np.array([1、2、3])

x.view(ma.MaskedArray) 

 

masked_array(data = [1、2、3]、mask = False、fill_value = 999999) 

x = np.array([(1、1。)、(2、2。)]、dtype = [( 'a'、int)、( 'b'、float)])

x.view(ma.MaskedArray) 

 

masked_array(data = [(1、1.0)、(2、2.0)]、mask = [(False、False)、(False、False)]、fill_value =(999999、1.e + 20)、dtype = [( 'a'、 '<i4')、( 'b'、 '<f8')]) 

次の関数もマスクされた配列を作成できます。 

関数名functionasarray(a [、dtype、order])は、指定された数値型に基づいて入力データをマスク配列に変換しますasanyarray(a [、dtype])は、サブタイプを変更せずに入力データをマスクに変換します配列fix_invalid( a [、mask、copy、fill_value])は、入力配列内の無効な要素を塗りつぶし値に置き換えますmasked_equal(x、value [、copy])は、配列内の値と等しい値をマスクしますmasked_greater(x、value [、copy] )配列内の値より大きい値をマスクしますmasked_greater_equal(x、value [、copy])配列内の値以上の値をマスクしますmasked_inside(x、v1、v2 [、copy])マスクします指定された間隔に該当する配列内の値masked_invalid(a [、copy])配列内の無効なデータ(NaNやinfなど)をマスクしますmasked_less(x、value [、copy])Masked_less_equal(x、value [ 、copy])は、配列内の値以下の値をマスクしますmasked_not_equal(x、value [、copy])は、配列内の値と等しくない値をマスクしますマスク操作masked_object(x、value [、copy、shrink])配列内の値に等しい値をマスクします(要素は「cats」などのオブジェクトです)masked_outside(x、v1、v2 [、copy])配列内の値は指定された範囲外ですMasked_values(x、value [、rtol、atol、copy、…])は、配列内の--masked_where(condition、a [、copy])でマスクされた部分に置き換えられます。条件を満たす部分をマスクします。

データへのアクセス 

 

マスクされた配列の基になるデータには、次の方法でアクセスできます。 

データ属性を介して。出力は配列のビューです。配列のタイプは、マスクされた配列が作成されたときの基になるデータ型によって異なります。numpy.ndarrayまたはそのサブクラスの場合があります。__array__メソッドを介して。出力は多次元配列numpy.ndarrayです。マスクされた配列のビューを多次元配列numpy.ndarrayまたはそのサブクラスの1つとして直接扱います(実際には、data属性を使用して行われます)。getdata関数を使用する。特定の項目が無効としてマークされている場合、これらの方法の結果は満足のいくものではありません。一般的なルールがあります。マスク項目のない配列表現が必要な場合は、filledメソッドで配列を埋めることをお勧めします。 

アクセスマスク 

 

マスク配列は、そのマスクプロパティを介してマスクを取得できます。マスクのTrueは無効なデータを示していることを覚えておく必要があります。マスクは、getmask関数とgetmaskarray関数を使用して取得することもできます。xがマスク配列の場合、getmask(x)はxのマスクを返します。それ以外の場合は、nomaskを返します。xがマスク配列の場合、getmaskarray(x)はxのマスクを返します。xに無効な値がない場合、またはマスクされた配列でない場合、関数はlen(x)Falseで構成されるブール配列を返します。 

有効な値のみを取得する 

配列内の有効な値を取得するために、マスクの反転をインデックスとして使用できます。マスク否定操作は、関数numpy.logical_notを使用するか、〜演算子を使用して実行できます。 

x = ma.array([[1、2]、[3、4]]、mask = [[0、1]、[1、0]])

x [〜x.mask] 

 

masked_array(data = [1、4]、mask = [False、False]、fill_value = 999999) 

有効な値を取得する別の方法は、圧縮されたメソッドを使用することです。これは、1次元のベクトルndarray(またはbaseclass属性の値に応じてそのサブクラス)を返します: 

x.compressed() 

 

array([1、4])注:compressedの戻り値は通常1次元です。 

マスクを変更する 

 

アイテムをブロックする 

 

マスクされた配列内の1つ以上の特定のアイテムを無効としてマークするための推奨される方法は、マスクされたマスクされた値をそれらに割り当てることです。 

x = ma.array([1、2、3])

x [0] = ma.masked

バツ 

 

masked_array(data = [–、2、3]、mask = [True、False、False]、fill_value = 999999) 

y = ma.array([[1、2、3]、[4、5、6]、[7、8、9]])

y [(0、1、2)、(1、2、0)] = ma.masked

そして 

 

masked_array(data = [[1、-、3]、[4、5、-]、[–、8、9]]、mask = [[False、True、False]、[False、False、True] 、[True、False、False]]、fill_value = 999999) 

z = ma.array([1、2、3、4])

z [:-2] = ma.masked

と 

 

masked_array(data = [–、-、3、4]、mask = [True、True、False、False]、fill_value = 999999) 

もう1つの方法は、マスクを使用してマスクを直接変更することですが、この方法は廃止されました。注:単純な非構造化データ型を使用して新しいマスク配列を作成すると、マスクはnomaskに初期化されます。これは、すべてFalseのブールシーケンスに相当します。配列内のすべての要素は、一緒にマスクをTrueに設定できます。 

x = ma.array([1、2、3]、mask = [0、0、1])

x.mask = True

バツ 

 

masked_array(data = [–、-、-]、mask = [True、True、True]、fill_value = 999999、dtype = int32) 

ブール値のシーケンスを割り当てることにより、配列内のどの要素がマスクで表されているかを判別できます。 

x = ma.array([1、2、3])

x.mask = [0、1、0]

バツ 

 

masked_array(data = [1、-、3]、mask = [False、True、False]、fill_value = 999999) 

ブロックされたアイテムのブロックを解除する 

新しい有効な値を割り当てることで、ブロックされたエントリのブロックを解除できます。 

x = ma.array([1、2、3]、mask = [0、0、1])

バツ 

 

masked_array(data = [1、2、-]、mask = [False、False、True]、fill_value = 999999) 

x [-1] = 5

バツ 

 

masked_array(data = [1、2、5]、mask = [False、False、False]、fill_value = 999999) 

注:マスク配列の属性がハードマスクの場合、効果的にマスクを解除できない場合があります。この機能は、ユーザーがマスク値を上書きするのを防ぐためのものです。配列のhard_mask属性をキャンセルする場合は、マスクを削除する前に、soften_maskメソッドを使用して配列をソフト化する必要があります。もちろん、変更後、harden_mask属性を使用して、マスク部分が変更されないようにすることもできます。 

x = ma.array([1、2、3]、mask = [0、0、1]、hard_mask = True)

バツ 

 

masked_array(data = [1、2、-]、mask = [False、False、True]、fill_value = 999999) 

x [-1] = 5

バツ 

 

masked_array(data = [1、2、-]、mask = [False、False、True]、fill_value = 999999) 

x.soften_mask()#柔らかくする

x [-1] = 5

バツ 

 

masked_array(data = [1、2、5]、mask = [False、False、False]、fill_value = 999999) 

x [-1] = ma.masked

xx.harden_mask()#マスクの部分的な変更を防ぐ

x [-1] = 2

バツ 

 

masked_array(data = [1、2、-]、mask = [False、False、True]、fill_value = 999999) 

マスク配列のマスクされたすべての部分(非ハードマスク)のマスクを解除する最も簡単な方法は、定数nomaskをマスクに割り当てることです。 

x = ma.array([1、2、3]、mask = [0、0、1])

バツ 

masked_array(data = [1、2、-]、mask = [False、False、True]、fill_value = 999999) 

x.mask = ma.nomask

バツ 

 

masked_array(data = [1、2、3]、mask = [False、False、False]、fill_value = 999999) 

インデックスとスライス 

 

MaskedArrayは多次元配列numpy.ndarrayのサブクラスであるため、インデックス作成とスライスのメカニズムを継承します。名前空間のないマスクされた配列の単一の要素を取得する場合、出力値はスカラー(マスクの対応する項目がFalseの場合)でも、マスクされた特別な値(マスクの対応する項目がTrueの場合)でもありません。 

x = ma.array([1、2、3]、mask = [0、0、1])

x [0] 

 

x [-1] 

 

マスク 

x [-1]はma.maskedです 

 

マスクされた配列に名前空間がある場合はTrueで、そこから要素を取得することは、多次元配列の戻りメカニズムと同じです。 

y = ma.masked_array([(1,2)、(3、4)]、mask = [(0、0)、(0、1)]、dtype = [( 'a'、int)、( 'b '、int)])

および[0] 

 

(1、2) 

および[-1] 

 

(3、-)マスクされた配列からスライスが取得された場合、戻り値はマスクされた配列と元の配列のビューのままです。返される配列のマスクは、nomask(元の配列に無効なデータがない場合)でも、元の配列マスクのコピーでもありません。したがって、元の配列を変更しながらスライスデータが変更されないように、スライスするときにディープコピーを作成することをお勧めします。 

x = ma.array([1、2、3、4、5]、mask = [0、1、0、0、1])

mx = x [:3]

mx 

 

masked_array(data = [1、-、3]、mask = [False、True、False]、fill_value = 999999) 

mx [1] = -1

mx 

 

masked_array(data = [1、-1、3]、mask = [False、False、False]、fill_value = 999999) 

x.mask#スライスデータの変更は元のデータに影響するため、ディープコピーである必要があります 

 

array([False、False、False、False、True]) 

x.data 

 

array([1、-1、3、4、5]) 

構造化データ型を使用してマスクされた配列のフィールドにアクセスすると、MaskedArrayが返されます。 

マスクされた配列を操作する 

 

マスクされた配列は、数学演算と論理演算をサポートします。マスク配列内の無効なデータは操作に参加しません。つまり、対応するデータ項目は操作の前後で変更されるべきではありません。注:マスク部分が変更されないという特徴は、マスク配列の属性ではないことを強調しておく必要があります。操作中にマスク値が変更される場合があるため、ユーザーは操作中にマスクを変更しないでください。仮定として、値は変更されません。numpy.maはほとんどの数学演算をサポートしています。特定の定義域を持つ一部の関数(log、divideなど)では、演算結果が無効な値の場合、マスクされた定数が返されます。 

ma.log([-1、0、1、2]) 

 

masked_array(data = [–、-、0.0、0.6931471805599453]、mask = [True、True、False、False]、fill_value = 1e + 20) 

マスク配列は標準のnumpy関数もサポートしており、出力はマスク配列です。関数の入力値がマスクされている場合、関数はこの部分を計算しません。入力値が関数のスコープを超えると、関数はマスク値を返します。 

x = ma.array([-1、1、0、2、3]、mask = [0、0、0、0、1])

np.log(x) 

 

masked_array(data = [–、0.0、-、0.6931471805599453、-]、mask = [True、False、True、False、True]、fill_value = 1e + 20) 

例 

欠落している値を表すために特別な値を使用する 

 

ここで、リストxがあります。ここで、-9999は欠落している値を表します。これらの値の平均を計算し、平均分析(平均からの各値の偏差)を実行したいと思います: 

numpy.maをmaとしてインポートします

x = [0.、1。、-9999.、3.、4。]

mx = ma.masked_values(x、-9999)

print( 'マスク配列の平均値:{}'。format(mx.mean()))

print( '各値と平均の違いは次のとおりです:{}'。format(mx-mx.mean()))

print( '各値と平均の差は次のとおりです:{}'。format(mx.anom())) 

 

マスク配列の平均は次のとおりです。2.0各値と平均の差は次のとおりです。[-2.0-1.0 – 1.02.0]各値と平均の差は次のとおりです。[-2.0-1.0 – 1.0 2.0] 

不足している値を入力します 

 

以前の配列を基準にして印刷していると仮定します。ここでは、欠落している値が平均に置き換えられています。 

print( '欠落している値を平均で埋めた後の結果:{}'。format(mx.filled(mx.mean()))) 

 

欠落している値を平均で埋めた後の結果:[0。1。2. 3. 4.] 

数値計算 

マスク配列では、分母が0、複素数の平方根などの欠落値を気にせずに数値計算を実行できます。 

numpyをnpとして、numpy.maをmaとしてインポートします

x = ma.array([1。、-1。、3.、4.、5.、6。]、mask = [0,0,0,0,1,0])

y = ma.array([1.、2.、0.、4.、5.、6。]、マスク= [0,0,0,0,0,1])

print(np.sqrt(x / y)) 

 

[1.0 – --1.0-]出力結果には4つの無効な値があります.1つ目は負の数の平方根が取られるため、2つ目は0による除算のため、最後の2つは入力値はマスクされます。 

極値を無視する 

 

要素が0から1までのランダムな浮動小数点数である配列dがあるとします。[0.1、0.9]の範囲の値を平均したい: 

d = np.random.random(size = 100)

print(ma.masked_outside(d、0.1、0.9).mean()) 

 

0.46533658283140283 

githubリンクhttps://github.com/wzy6642/numpy-translate

おすすめ

転載: blog.csdn.net/u013946150/article/details/113057584