これが私の仕事中に遭遇した問題です
マスクが設定されていない場合の問題
>>> a =np.arange(6,dtype=np.float64).reshape((2,3))
>>> a
array([[ 0., 1., 2.],
[ 3., 4., 5.]])
>>> am = np.ma.masked_array(a)
>>> am
masked_array(data =
[[ 0. 1. 2.]
[ 3. 4. 5.]],
mask =
False,
fill_value = 1e+20)
>>> am[0][1]=np.ma.masked
>>> am
masked_array(data =
[[ 0. 1. 2.]
[ 3. 4. 5.]],
mask =
False,
fill_value = 1e+20)
###--------- doesn't work----------------
>>> am[0,1]=np.ma.masked
>>> am
masked_array(data =
[[0.0 -- 2.0]
[3.0 4.0 5.0]],
mask =
[[False True False]
[False False False]],
fill_value = 1e+20)
###-------this way it works---------
>>> am[1][1]=np.ma.masked
>>> am
masked_array(data =
[[0.0 -- 2.0]
[3.0 -- 5.0]],
mask =
[[False True False]
[False True False]],
fill_value = 1e+20)
###--------now it surprisingly works again--
Linux 3.19.8-100.fc20.x86_64
Python 2.7.5
>>> np.__version__
'1.8.2'
私のシステムは最新ではないことは知っていますが、持っている友人に尋ねました
そして彼は問題が存在することを確認します
マスター(1.12)で確認済み。 これは#5580が修正したいと思っていたものと似ていますが、そこで説明したように、この特定のケースは、 np.nomask
を削除するためのMaskedArrayのオーバーホールなしでは修正できません。
問題は次のとおりです。MaskedArraysはマスクをブール値の配列として格納する場合があり、(マスクされた値がない場合)マスクを単に値False
(およびnp.nomask == False)として格納する場合もあります。
問題は、MaskedArrayをスライスする(そしてビューを取得する)ときに、マスクが現在ブール値の配列である場合にのみ「表示」でき、定数「False」の場合は表示できないことです。 したがって、初めてam[0][1] = ...
を試すとき、マスクは定数「False」であり、表示できないため、更新されません。 2回目の試行では、マスクはブール値の配列として格納されているため、表示できるため、更新されます。
このnomask
デザインによって引き起こされるバグの長いリストにこれを追加します(例:#7588)。
nomask
について考えるたびに、ドナルド・クヌースの「時期尚早な最適化はすべての悪の根源である」という言葉も思い浮かびます。
nomask
も例外ではないようです。 この動作から発生する異常なケースの数は非常に多く、そのために修正がより困難になります。
マスクが些細なものであるかどうかを知ることが本当に生産的なことである場合、結果をキャッシュするhas_mask
ようなメソッドを簡単に作成できます。
nomask
完全に削除することに関心はありますか?
私もこの問題に遭遇したという点でチャイムを鳴らしたいと思います。 それについてのドキュメントにメモを追加することは価値があるかもしれません。 以下は、ビューのマスクを変更すると元のマスクが変更されることを私に示唆しています。
スライスにアクセスすると、出力は、
data
属性が元のデータのビューであり、マスクがnomask
いずれかであるマスクされた配列です(元の配列に無効なエントリがなかった場合)または、元のマスクの対応するスライスのビュー。 ビューは、マスクの変更を元のマスクに確実に伝播するために必要です。
ノーマスクを完全に削除することに関心はありますか?
たぶん、 masked
。 これはおそらく、マスクされた配列に大きな変更を加えるか、新しいクラスを完全に実装することになります。 NEPをまとめる価値があるかもしれません。 私はめったにマスクされた配列を使用しないので、これは機能を必要とする人々によって最もよく行われるものです。
最も参考になるコメント
nomask
について考えるたびに、ドナルド・クヌースの「時期尚早な最適化はすべての悪の根源である」という言葉も思い浮かびます。nomask
も例外ではないようです。 この動作から発生する異常なケースの数は非常に多く、そのために修正がより困難になります。マスクが些細なものであるかどうかを知ることが本当に生産的なことである場合、結果をキャッシュする
has_mask
ようなメソッドを簡単に作成できます。nomask
完全に削除することに関心はありますか?