我想用零值替換2D數組中的所有屏蔽值。 我看到np.copyto它顯然可以做到這一點爲:Python - 替換數組中的屏蔽數據
test=np.copyto(array, 0, where = mask)
但我有一個錯誤信息......「模塊」對象有沒有屬性「CopyTo用於」。有沒有相同的方法來做到這一點?
我想用零值替換2D數組中的所有屏蔽值。 我看到np.copyto它顯然可以做到這一點爲:Python - 替換數組中的屏蔽數據
test=np.copyto(array, 0, where = mask)
但我有一個錯誤信息......「模塊」對象有沒有屬性「CopyTo用於」。有沒有相同的方法來做到這一點?
儘量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. ])
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] = 0
和np.copyto(array, 0, where=mask)
會有不同的表現:
np.copyto
(is 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
行(其中mask
是True
)和 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
'array [mask] = 0'或使用'np.where' – sebix