這個共享的面具業務有點混亂。
當前的行爲:
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)
新值和掩碼同時出現在y
和x
:
未來的行爲,沒有警告,可以與生產。
底線是 - 當您更改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
而變化。
您是否研究過此部分:https://docs.scipy.org/doc/numpy/release.html#assigning-to-slices-views-of-maskedarray – hpaulj
有關此警告的擴展討論:https:// github .COM/numpy的/ numpy的/問題/ 7164。我沒有看到它在新版本中已被更改的證據。 – hpaulj