Numpy: バグ:mask = nomaskを使用してビューにマスクを設定しても、所有者に伝達されません

作成日 2016年06月27日  ·  4コメント  ·  ソース: numpy/numpy

これが私の仕事中に遭遇した問題です
マスクが設定されていない場合の問題

>>> 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'

私のシステムは最新ではないことは知っていますが、持っている友人に尋ねました
そして彼は問題が存在することを確認します

00 - Bug numpy.ma

最も参考になるコメント

nomaskについて考えるたびに、ドナルド・クヌースの「時期尚早な最適化はすべての悪の根源である」という言葉も思い浮かびます。

nomaskも例外ではないようです。 この動作から発生する異常なケースの数は非常に多く、そのために修正がより困難になります。

マスクが些細なものであるかどうかを知ることが本当に生産的なことである場合、結果をキャッシュするhas_maskようなメソッドを簡単に作成できます。

nomask完全に削除することに関心はありますか?

全てのコメント4件

マスター(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をまとめる価値があるかもしれません。 私はめったにマスクされた配列を使用しないので、これは機能を必要とする人々によって最もよく行われるものです。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

keithbriggs picture keithbriggs  ·  3コメント

toddrjen picture toddrjen  ·  4コメント

'
Pezhvuk picture Pezhvuk  ·  4コメント

marcocaccin picture marcocaccin  ·  4コメント

perezpaya picture perezpaya  ·  4コメント