2016-12-07 9 views
4

最近、numpy 1.11からnumpy 1.13にアップグレードされましたが、このマスクされた配列の警告を取り除くことを望んでいます。 numpy 1.13 MaskedArrayFutureWarning:共有マスクを持つマスクされた配列の項目を設定してもマスクがコピーされない

MaskedArrayFutureWarning: setting an item on a masked array which has a shared mask will not copy the mask and also change the original mask array in the future. Check the NumPy 1.11 release notes for more information.*

基本的に私のコードは、マスクされた配列の一部の値を変更するだけです。このエラーが何を意味するのかはわかりません。

私はnumpy 1.13へのアップグレードがこれを解決することを期待していましたが、エラーは私の目的であると思います。

明確にするために、私は1.11を参照の警告にもかかわらず、numpyの1.13を実行しているが:

のPython 2.7.12(デフォルト、2016年11月19日、午前6時48分10秒)

[GCC 5.4。 0 20160609] on linux2

詳細については、「help」、「copyright」、「credits」または「license」と入力してください。

インポートnumpyをnp

np。 バージョン

'不明1.13.0.dev0 +' 任意の助け

感謝。 Cat

+0

このセクションについて勉強したことがありますか:https://docs.scipy.org/doc/numpy/release.html#assigning-to-slices-views-of-maskedarray – hpaulj

+0

この警告に関する拡張された説明:https:// github .com/numpy/numpy/issues/7164。私はそれが新しいリリースで変更されたという証拠は見ません。 – hpaulj

答えて

7

この共有マスクビジネスはちょっと混乱します。

現在の行動:

In [150]: x=np.ma.masked_greater(np.arange(8),5) 
In [151]: x 
Out[151]: 
masked_array(data = [0 1 2 3 4 5 -- --], 
      mask = [False False False False False False True True], 
     fill_value = 999999) 
In [152]: y=x[3:6]   # a view 
In [153]: y[0]=30   # modify the view 
/usr/local/bin/ipython3:1: MaskedArrayFutureWarning: setting an item on a masked array which has a shared mask will not copy the mask and also change the original mask array in the future. 
Check the NumPy 1.11 release notes for more information. 
    #!/usr/bin/python3 

data値の変更がソース

In [154]: y 
Out[154]: 
masked_array(data = [30 4 5], 
      mask = [False False False], 
     fill_value = 999999) 
In [155]: x 
Out[155]: 
masked_array(data = [0 1 2 30 4 5 -- --], 
      mask = [False False False False False False True True], 
     fill_value = 999999) 

が、マスク値の変更と共有されているではありません。

In [156]: y.mask[0]=True 
In [157]: y 
Out[157]: 
masked_array(data = [-- 4 5], 
      mask = [ True False False], 
     fill_value = 999999) 
In [158]: x 
Out[158]: 
masked_array(data = [0 1 2 30 4 5 -- --], 
      mask = [False False False False False False True True], 
     fill_value = 999999) 

は、新しいビューを作成し、 unshareメソッドに電話する:

In [159]: y=x[3:6] 
In [160]: y.unshare_mask() 
Out[160]: 
masked_array(data = [30 4 5], 
      mask = [False False False], 
     fill_value = 999999) 
In [161]: y[0]=31 
In [162]: y 
Out[162]: 
masked_array(data = [31 4 5], 
      mask = [False False False], 
     fill_value = 999999) 
In [163]: x 
Out[163]: 
masked_array(data = [0 1 2 31 4 5 -- --], 
      mask = [False False False False False False True True], 
     fill_value = 999999) 

警告を発行せずにdataを変更します。

将来の挙動は、警告なし、で製造することができる。

In [172]: x=np.ma.masked_greater(np.arange(8),5) 
In [174]: y=x[3:6] 
In [175]: y._sharedmask=False 
In [176]: y[0]=30 
In [177]: y.mask[0]=True 
In [178]: y 
Out[178]: 
masked_array(data = [-- 4 5], 
      mask = [ True False False], 
     fill_value = 999999) 
In [179]: x 
Out[179]: 
masked_array(data = [0 1 2 -- 4 5 -- --], 
      mask = [False False False True False False True True], 
     fill_value = 999999) 

新しい値とマスクがyxの両方に表示されます。

y(データまたはマスク)の値を変更すると、xのマスクはどうなりますか?変更かどうか?

=================

またはビュー内のデータ値を設定することもあるかもしれないマスクを変更した場合明確:

In [199]: x=np.ma.masked_greater(np.arange(8),5) 
In [200]: y=x[4:] 
In [201]: y 
Out[201]: 
masked_array(data = [4 5 -- --], 
      mask = [False False True True], 
     fill_value = 999999) 
In [202]: y[-1]=0 
/usr/local/bin/ipython3:1: MaskedArrayFutureWarning: setting an item on a masked array which has a shared mask will not copy the mask and also change the original mask array in the future. 
Check the NumPy 1.11 release notes for more information. 
    #!/usr/bin/python3 
In [203]: y 
Out[203]: 
masked_array(data = [4 5 -- 0], 
      mask = [False False True False], 
     fill_value = 999999) 
In [204]: x 
Out[204]: 
masked_array(data = [0 1 2 3 4 5 -- --], 
      mask = [False False False False False False True True], 
     fill_value = 999999) 

最後のyの値はマスクされていませんが、対応するxは(私はx.dataの変更を示していたはずです)。これは警告されている現在の動作です。

しかしfuture行動と

In [205]: y=x[4:] 
In [206]: y._sharedmask=False 
In [207]: y[-1]=0 
In [208]: y 
Out[208]: 
masked_array(data = [4 5 -- 0], 
      mask = [False False True False], 
     fill_value = 999999) 
In [209]: x 
Out[209]: 
masked_array(data = [0 1 2 3 4 5 -- 0], 
      mask = [False False False False False False True False], 
     fill_value = 999999) 

xデータとマスクがyと一緒に変更されました。

+0

とても役に立ちます!本当にこの答えがより多くの可視性を持っていればいいと思っています... UPVOTE! – DilithiumMatrix

+0

大きな説明。私もこの警告で無力になりました - 今まで – ascripter

関連する問題