5

私は自分の仕事で常にマスク配列を使用していましたが、マスク配列の初期化が少しぎこちないという問題が 1 つあります。具体的には、ma.zeros() と ma.empty()は、配列の次元と一致しないマスクを持つマスクされた配列を返します。これが必要な理由は、配列の特定の要素に割り当てない場合、デフォルトでマスクされるようにするためです。

In [4]: A=ma.zeros((3,))
...
masked_array(data = [ 0.  0.  0.],
             mask = False,
       fill_value = 1e+20)

その後、マスクを割り当てることができます。

In [6]: A.mask=ones((3,))
...
masked_array(data = [-- -- --],
             mask = [ True  True  True],
       fill_value = 1e+20)

しかし、初期化と配列のために 2 行を使用する必要があるのはなぜですか? あるいは、ma.zeros() 機能を無視して、マスクとデータを 1 行で指定することもできます。

In [8]: A=ma.masked_array(zeros((3,)),mask=ones((3,)))
...
masked_array(data = [-- -- --],
             mask = [ True  True  True],
       fill_value = 1e+20)

でも、これもむずかしいと思います。ドキュメントをnumpy.ma調べましたが、これをうまく処理する方法が見つかりません。明らかな何かを見逃しましたか?

4

2 に答える 2

4

のマスクは、実際には に対応するma.zeros特別な定数です。これは、マスクが設定されていないことを NumPy に伝える単なるプレースホルダーです。実際に使用すると、大幅に高速化されます。マスクされた値がないことが事前にわかっている場合は、マスクされた値がどこにあるかを追跡する必要はありません。ma.nomasknp.bool_(False)nomasknp.ma

最善の方法は、マスクが必要ない場合は明示的にマスクを設定せずnp.ma、必要な場合 (つまり、負の数の対数を取得しようとする場合) は設定したままにすることです。


サイドノート#1:マスクをFalse入力と同じ形状の配列に設定するには、使用します

np.ma.array(..., mask=False)

その方が入力しやすいです。これは実際には PythonFalseであり、... ではないことに注意してくださいnp.ma.nomask。同様に、 を使用mask=Trueして、すべての入力を強制的にマスクします (つまり、と同じ形状の でいっぱいのmaskbool になります)。ndarrayTruedata


補足 #2: 初期化後にマスクを設定する必要がある場合は、代入を使用するのではなく.mask、特別な値に代入するnp.ma.masked方が安全です。

a[:] = np.ma.masked
于 2012-11-13T01:33:44.223 に答える
0

残念ながら、複数の次元を持つ配列では、サイドノート#2の推奨事項が破られます。

a = ma.zeros( (2,2) )
a[0][0] = ma.masked
a
masked_array(data =
 [[ 0.  0.]
 [ 0.  0.]],
         mask =
 False,
   fill_value = 1e+20)

OPのように、私はこれをうまく回避する方法を見つけていません。行全体をマスキングすると、マスクが適切に初期化されます。

 a[0] = ma.masked
 a
 masked_array(data =
 [[-- --]
 [0.0 0.0]],
             mask =
 [[ True  True]
 [False False]],
       fill_value = 1e+20)

しかし、これがやりたくない場合はa[0] = ma.nomask、元に戻す必要があります。直後a[0] = ma.nomaska = ma.zeros( (2,2) )行っても効果はありません。

于 2015-06-09T15:18:22.633 に答える