在最近numpy的警告是:
In [738]: func1(A[1],1)
/usr/local/bin/ipython3:2: 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.
http://docs.scipy.org/doc/numpy/release.html#assigning-to-slices-views-of-maskedarray
目前一個屏蔽數組的一個切片包含原始數據的視圖和的一個寫入時複製視圖面具。因此,對切片掩碼的任何更改都會導致原始掩碼的複製,並且新掩碼被更改而不是原始掩碼。
執行此操作後,A的第1行仍然被屏蔽,但A[
,:]。data已被更改。
In [757]: B=np.ma.masked_all((5))
...
In [759]: B[0]=5 # direct __setitem__ change to B
In [760]: B
Out[760]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [761]: func1(B[3:],1)
/usr/local/bin/ipython3:2: MaskedArrayFutureWarning: ....
In [762]: B # no change to mask
Out[762]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [763]: B.data # but data is changed
Out[763]: array([ 5., 0., 0., 1., 1.])
A[1,:]=1
是直接使用的蒙面__setitem__
的,它可以採取同時設置data
和mask
全部責任。在您的功能A
是原始視圖,通過A.__getitem__
調用獲得。顯然,開發人員擔心這個視圖的蒙版更改是否會影響原始蒙版的蒙版。
我們可能不得不看開發商的討論;該警告表明最近發生了一些變化。
============
的問題是不是在一個函數使用,它是關於一個視圖
In [764]: B1=B[3:]
In [765]: B1[:]=2
/usr/local/bin/ipython3:1: MaskedArrayFutureWarning:...
In [766]: B
Out[766]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [767]: B.data
Out[767]: array([ 5., 0., 0., 2., 2.])
警告說明現在發生的事情,並可能持續一段時間。這是說這種做法會改變。
繼變化筆記建議:
In [785]: B1=B[3:]
In [787]: B1._sharedmask
Out[787]: True
In [790]: B1._sharedmask=False
In [791]: B1[:]=4
In [792]: B1
Out[792]:
masked_array(data = [4.0 4.0],
mask = [False False],
fill_value = 1e+20)
In [793]: B # mask has been changed along with data
Out[793]:
masked_array(data = [5.0 -- -- 4.0 4.0],
mask = [False True True False False],
fill_value = 1e+20)
因此改變
def func1(arr,val):
arr._sharedmask=False
arr[:]=val
將停止報警,並修改原始數組的面具。
你是不是更好從'func1'返回'arr',然後做'arr_3d [0] = func1(arr_3d [0],1)'? –
你想要什麼行爲? – hpaulj