マスクされた配列に対する numpy の操作の詳細な説明

目次

1. マスク配列を作成する

1.2 リスト生成マスク配列

1.3 配列からマスクされた配列を生成する

1.4 配列内の特殊な値をマスクする

1.5 配列内の特定の値をマスクする

1.6 配列内の特定の条件を満たす値をマスクする

1.7 1 つの配列のフィルター結果を使用して別の配列をマスクする

2. マスク配列にアクセスする

2.1 インデックス付けとスライス

2.2 機能の適用

2.3 データビューとマスクされた配列のコピー

2.4 マスク配列を変更する


numpy.ma サブモジュールは、マスクされた配列を導入することにより、欠落データまたは無効なデータの問題を解決する安全かつ便利な方法を提供します。numpy.ma サブモジュールの本体は、numpy.ndarray の派生クラスである MaskedArray クラスです。配列の無効な値が予期せぬ事態を引き起こすかどうかを考慮せずに、numpy.ma サブモジュールを ndarray として使用できます。動作です。

1. マスク配列を作成する

import numpy as np
​
m = np.ma.array([0, 1, 2, 3])
print(m)

1.1 リスト生成マスク配列

マスクされた配列サブモジュールの ma.array() 関数は、NumPy の np.array() 関数に似ています。リストからマスクされた配列を直接生成できます。デフォルトのマスク パラメーターは False で、生成される配列の型は MaskedArray クラスです。配列マスク処理後は、最大値、最小値を探す場合でも、平均や分散を計算する場合でも、データが無効かどうかを心配する必要はなくなります。

import numpy as np
​
m = np.ma.arange(10)
mask = [0 for i in range(10)]
m = np.ma.array(m,mask=mask)
print(m)
mask[1:5] = [1,1,1,1]  #指定1到5无效
m = np.ma.array(m,mask=mask)
print(m)
​
结果:
[0 1 2 3 4 5 6 7 8 9]
[0 -- -- -- -- 5 6 7 8 9]

1.2 配列からマスク配列を生成する

ma.asarray() 関数は、通常の NumPy 配列をマスクされた配列に変換できます。新しく生成されたマスクされた配列は、元の配列の np.nan または np.inf をマスクしませんが、それに応じて塗りつぶし値 (fill_value) を調整します。

a = np.arange(5)
print(np.ma.asarray(a))
a = np.array([1, np.nan, 2, np.inf, 3]) # 包含特殊值的数组
print(np.ma.asarray(a))

1.3 配列内の特殊な値をマスクする

ma.asarray() 関数は元の配列の np.nan または np.inf をマスクしませんが、ma.masked_invalid() 関数はこの機能を実現できます。

a = np.array([1, np.nan, 2, np.inf, 3]) # 包含特殊值的数组
print(np.ma.masked_invalid(a))

1.4 配列内の特定の値をマスクする

場合によっては、配列内の指定された値を無効化 (マスク) する必要がある場合、ma.masked_equal() 関数を使用してこの機能を実現できます。

m = np.arange(5).repeat(3)
print(np.ma.masked_equal(m,3))

1.5 配列内の特定の条件を満たす値をマスクする

場合によっては、配列内で条件を満たす特定の値を無効に設定する必要があります (マスク)。マスク配列サブモジュールは、条件付きマスクを実装するためのいくつかの関数を提供します。これらの可能なフィルター条件には、「以上」、「以上」、「未満」、「以下」、間隔内、および間隔外が含まれます。

例:

m = np.arange(10).repeat(3)
print(np.ma.masked_greater(m,5)) #掩码大于5的元素
print(np.ma.masked_greater_equal(m,5))  #掩码大于等于5的元素
print(np.ma.masked_less(m,5)) #掩码小于5的元素
print(np.ma.masked_less_equal(m,5)) #掩码小于等于5的元素
print(np.ma.masked_inside(m,4,6)) #掩码在[4,5]之间的元素
print(np.ma.masked_outside(m,4,6)) #掩码在[4,6]之外的元素

1.6 ある配列のフィルター結果を使用して別の配列をマスクする

a と b は同じ構造を持つ 2 つの配列ですが、配列 b が a>5 の条件でマスクされている場合、上記の関数は無効になります。ここで、ma.masked_where() 関数が役に立ちます。もちろん、この関数は配列自体をマスクすることもできます。

a = np.arange(8)
print(a)
b = np.random.random(8)
print(b)
print(np.ma.masked_where(a>5, b)) # 用a>5的条件掩码数组b
​
结果:
[0 1 2 3 4 5 6 7]
[0.78523106 0.86561868 0.31776667 0.9725608  0.44171764 0.5522423
 0.12392154 0.80691097]
[0.7852310636212392 0.8656186784921848 0.3177666685735746
 0.9725607999251317 0.44171764470476294 0.5522422981444314 -- --]

2. マスク配列にアクセスする

2.1 インデックス付けとスライス

MaskedArray クラスは numpy.ndarray の派生クラスであるため、通常の NumPy 配列で使用されるインデックス付けおよびスライス操作は引き続き使用できます。

a = np.array([1, np.nan, 2, np.inf, 3])
a = np.ma.masked_invalid(a)
print(a[0], a[1], a[-1])
print(a[1:-1])

2.2 機能の適用

マスクされた配列の組み込みメソッドの使用方法は、最大値、最小値、平均値、分散の使用など、通常の配列の使用方法と変わりません。NumPy 名前空間で関数を使用する場合は注意してください。マスクされた配列サブモジュールに対応する関数がある場合は、マスクされた配列サブモジュールの対応する関数を最初に使用する必要があります。たとえば、マスクされた配列のサインを求めるために np.sin() 関数を使用すると、警告メッセージが発行されますが、ma.sin() 関数を使用した場合は問題ありません。

a = np.array([1, np.nan, 2, np.inf, 3])
a = np.ma.masked_invalid(a)
print(a.min(), a.max(), a.mean(), a.var())
print(np.ma.sin(a)) # np.sin(a)可以执行,但会弹出警告。ma.sin(a)才是正确的用法

2.3 データビューとマスクされた配列のコピー

いずれの場合も、マスク配列の data 属性を通じてマスク配列のデータ ビューを取得できます。その型は np.ndarray 配列です。さらに、マスクされた配列のarray () 関数または ma.getdata() 関数を使用して、マスクされた配列のデータ ビューを取得することもできます。データ ビューを取得する上記の 3 つの方法は、基本的にマスク配列自体に対する操作です。データ ビューのコピーが必要な場合は、copy() 関数を使用します。

a = np.ma.array([1, np.nan, 2, np.inf, 3])
print(a)
x = a.data
y = a.__array__()
z = np.ma.getdata(a)
w = np.copy(a.__array__()) # 复制数据视图
print(x)
print(y)
print(z)
print(w)
a[-1] = 9
print(x)
print(y)
print(z)
print(w)

2.4 マスク配列を変更する

現在の配列のマスク ステータスは、マスク配列のマスク属性を通じて確認できます。通常、配列マスクはブール配列またはブール値です。

a = np.ma.masked_invalid(np.array([1, np.nan, 2, np.inf, 3]))
print(a.mask) #False表示没有掩码处理,True表示进行了掩码处理

配列スライスまたは配列の要素をマスクしたい場合は、スライスまたは要素を ma.masked 定数と等しくするだけです。

a[:2] = np.ma.masked
print(a.mask)

配列スライスまたは配列内の要素のマスクを解除する場合は、スライスまたは要素に対して代入操作を実行するだけです。

おすすめ

転載: blog.csdn.net/longhaierwd/article/details/131858547