python 初始化数组 numpy,Python Numpy蒙版数组初始化

我在工作中一直使用掩码数组,但是我遇到的一个问题是,掩码数组的初始化有点笨拙.具体来说,ma.zeros()和ma.empty()返回的蒙版数组的掩码与数组维数不匹配.我想要这样做的原因是,如果不分配给数组的特定元素,则默认情况下会将其屏蔽.

In [4]: A=ma.zeros((3,))

...

masked_array(data = [ 0. 0. 0.],

mask = False,

fill_value = 1e+20)

我可以随后分配掩码:

In [6]: A.mask=ones((3,))

...

masked_array(data = [-- -- --],

mask = [ True True True],

fill_value = 1e+20)

但是,为什么我必须使用两行来初始化和数组?另外,我可以忽略ma.zeros()功能,并在一行中指定掩码和数据:

In [8]: A=ma.masked_array(zeros((3,)),mask=ones((3,)))

...

masked_array(data = [-- -- --],

mask = [ True True True],

fill_value = 1e+20)

但是我认为这也很笨拙.我已经浏览了numpy.ma文档,但是找不到一种处理此问题的灵巧方法.我错过了明显的事情吗?

解决方法:

好吧,ma.zeros中的掩码实际上是一个特殊常量ma.nomask,它对应于np.bool_(False).只是一个占位符,告诉NumPy尚未设置蒙版.

使用nomask实际上可以显着提高np.ma:如果我们事先知道不存在被屏蔽的值,则无需跟踪被屏蔽的值在哪里.

最好的方法是不要在不需要时显式设置掩码,而在需要时(即,当您最终尝试获取负数的对数时)保留np.ma进行设置.

旁注1:将遮罩设置为与输入形状相同的False数组,请使用

np.ma.array(..., mask=False)

这更容易键入.请注意,这实际上是Python False,不是np.ma.nomask …类似地,使用mask = True强制屏蔽所有输入(即mask将是一个充满True的布尔ndarray,其形状与数据).

旁注2:

如果您需要在初始化后设置掩码,则不要对.mask使用赋值,而应将其赋给特殊值np.ma.masked,这是更安全的:

a[:] = np.ma.masked

标签:initialization,arrays,python,numpy

来源: https://codeday.me/bug/20191031/1977379.html

你可能感兴趣的:(python,初始化数组,numpy)