Python - 替换数组中的掩码数据

时间:2014-11-16 11:24:17

标签: python arrays numpy masking

我想将零值替换为二维数组中的所有掩码值。 我用np.copyto看到它显然可以这样做:

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

但我有一条错误消息......' module'对象没有属性' copyto'。是否有相同的方法来做到这一点?

2 个答案:

答案 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] = 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是1维布尔数组时, array[mask]正在选择array行(其中maskTrue)和。{ 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