我想将零值替换为二维数组中的所有掩码值。 我用np.copyto看到它显然可以这样做:
test=np.copyto(array, 0, where = mask)
但我有一条错误消息......' module'对象没有属性' copyto'。是否有相同的方法来做到这一点?
答案 0 :(得分: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 :(得分:1)
test = np.copyto(array, 0, where=mask)
相当于:
array = np.where(mask, 0, array)
test = None
(我不确定你为什么要为np.copyto
的返回值赋值;如果没有引发异常,它总是返回None。)
为什么不使用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
是1维布尔数组时,
array[mask]
正在选择array
行(其中mask
为True
)和。{
array[mask] = 0
将这些行设置为零。
令人惊讶的是,即使array[mask]
有4个元素且mask
只有3行,array
也不会引发IndexError。当第四个值为False时,不会引发IndexError,但如果第四个值为True,则引发IndexError:
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