Python numpy 屏蔽数组初始化

标签 python arrays numpy initialization

我在工作中一直使用掩码数组,但我遇到的一个问题是掩码数组的初始化有点笨拙。具体来说,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 的 bool ndarray,与 data 具有相同的形状).


旁注 #2: 如果你需要在初始化后设置掩码,你不应该使用赋值给.mask,而是赋值给特殊值np.ma.masked,这样更安全:

a[:] = np.ma.masked

关于Python numpy 屏蔽数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13354295/

相关文章:

python - 在 PyDev 中运行 Twisted 应用程序

python - 快速加权散点矩阵计算

c++ - TCHAR 数组在反斜杠后追加 w

python - 如何更改 Numpy 中的二维数组元素?

python - 将直方图放入 tkinter 框架中

python - '类型错误 : an integer is required' when initializing random weight matrix in numpy with numpy. random.randn()

c - 错误: "an array may not have elements of this type"

javascript - for 循环将多个值推送到数组中

python - python中的N维数组

python - reshape 向量并用 nan 填充最后缺失的位置