2014-11-16 49 views
0

我想用零值替換2D數組中的所有屏蔽值。 我看到np.copyto它顯然可以做到這一點爲:Python - 替換數組中的屏蔽數據

test=np.copyto(array, 0, where = mask) 

但我有一個錯誤信息......「模塊」對象有沒有屬性「CopyTo用於」。有沒有相同的方法來做到這一點?

+1

'array [mask] = 0'或使用'np.where' – sebix

回答

4

儘量numpy.ma.filled() 我想,這正是你需要

In [29]: a 
Out[29]: array([ 1, 0, 25, 0, 1, 4, 0, 2, 3, 0]) 
In [30]: am = n.ma.MaskedArray(n.ma.log(a),fill_value=0) 
In [31]: am 
Out[31]: 
masked_array(data = [0.0 -- 3.2188758248682006 -- 0.0 1.3862943611198906 -- 0.6931471805599453 1.0986122886681098 --], 
mask = [False True False True False False True False False True], 
fill_value = 0.0) 
In [32]: am.filled() 
Out[32]: 
array([ 0.  , 0.  , 3.21887582, 0.  , 0.  , 
    1.38629436, 0.  , 0.69314718, 1.09861229, 0.  ]) 
1

test = np.copyto(array, 0, where=mask)等同於:

array = np.where(mask, 0, array) 
test = None 

(我不知道你爲什麼會想將值分配到的np.copyto返回值;如果不發生異常,它總是返回無。)


爲什麼不使用array[mask] = 0

確實,如果mask是一個與array形狀相同的布爾數組,那麼它將工作(並且語法更好)。如果mask不具有相同的形狀,然後array[mask] = 0np.copyto(array, 0, where=mask)會有不同的表現:

np.copytois documented to)和np.where(似乎)廣播面膜的形狀相匹配array。 相比之下,array[mask] = 0不會廣播mask。這導致行爲有很大的不同,當mask不具有相同的形狀array

In [60]: array = np.arange(12).reshape(3,4) 

In [61]: mask = np.array([True, False, False, False], dtype=bool) 

In [62]: np.where(mask, 0, array) 
Out[62]: 
array([[ 0, 1, 2, 3], 
     [ 0, 5, 6, 7], 
     [ 0, 9, 10, 11]]) 

In [63]: array[mask] = 0 

In [64]: array 
Out[64]: 
array([[ 0, 0, 0, 0], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

array是2維和mask是一維布爾數組, array[mask]被選擇的array行(其中maskTrue)和 array[mask] = 0將這些行設置爲零。

令人驚訝的是,即使mask有4個元素,並且array只有3行,array[mask]也不會引發IndexError。當第四值爲False否IndexError上升,而是一個IndexError,那麼就會拋出第四值爲True:

In [91]: array[np.array([True, False, False, False])] 
Out[91]: array([[0, 1, 2, 3]]) 

In [92]: array[np.array([True, False, False, True])] 
IndexError: index 3 is out of bounds for axis 0 with size 3