2016-08-25 33 views
0

我需要修改的功能,例如內蒙面陣列的一部分內:蟒蛇 - 修改蒙面陣列的一部分功能

import numpy.ma as ma 

arr_2d = ma.masked_all((5,5)) 
arr_3d = ma.masked_all((5,5,5)) 
arr_3d[0,1] = 5 

def func1(arr, val): 
    arr[:] = val 

看起來很簡單,但隨後...

>>> func1(arr_3d[0], 1) 
>>> arr_3d[0] 
masked_array(data = 
[[-- -- -- -- --] 
[1.0 1.0 1.0 1.0 1.0] 
[-- -- -- -- --] 
[-- -- -- -- --] 
[-- -- -- -- --]], 
      mask = 
[[ True True True True True] 
[False False False False False] 
[ True True True True True] 
[ True True True True True] 
[ True True True True True]], 
     fill_value = 1e+20) 

它似乎與總是在數組的片上設置共享掩碼有關,以便將掩碼作爲副本傳遞給函數

我希望可能有某種方法來修復或繞過它行吟詩人而不是明確地傳遞掩碼,返回數據的副本或將大數組傳遞給索引。

+0

你是不是更好從'func1'返回'arr',然後做'arr_3d [0] = func1(arr_3d [0],1)'? –

+0

你想要什麼行爲? – hpaulj

回答

0

在最近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__的,它可以採取同時設置datamask全部責任。在您的功能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 

將停止報警,並修改原始數組的面具。