Tho*_*ubb 6 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)
Run Code Online (Sandbox Code Playgroud)
我随后可以分配掩码:
In [6]: A.mask=ones((3,))
...
masked_array(data = [-- -- --],
mask = [ True True True],
fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)
但为什么我必须使用两行来初始化和数组呢?或者,我可以忽略 ma.zeros() 功能并在一行中指定掩码和数据:
In [8]: A=ma.masked_array(zeros((3,)),mask=ones((3,)))
...
masked_array(data = [-- -- --],
mask = [ True True True],
fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)
但我认为这也很笨拙。我已经浏览了numpy.ma文档,但找不到处理此问题的巧妙方法。我错过了一些明显的事情吗?
嗯, 中的掩码ma.zeros实际上是一个特殊的常量 ,ma.nomask它对应于np.bool_(False)。它只是一个占位符,告诉 NumPy 掩码尚未设置。nomask实际上使用速度np.ma会显着加快:如果我们事先知道没有掩码值,则无需跟踪掩码值在哪里。
最好的方法是,如果不需要,则不要显式设置掩码,并np.ma在需要时保留设置(即,当您最终尝试获取负数的对数时)。
旁注#1:要将掩码设置为False与输入形状相同的数组,请使用
np.ma.array(..., mask=False)
Run Code Online (Sandbox Code Playgroud)
这样更容易打字。请注意,它实际上是 Python False,而不是np.ma.nomask...类似地,使用mask=True来强制屏蔽所有输入(即,mask将是一个ndarray充满 的bool True,其形状与 相同data)。
旁注#2:如果您需要在初始化后设置掩码,则不应使用赋值给.mask而是分配给特殊值np.ma.masked,这样更安全:
a[:] = np.ma.masked
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5294 次 |
| 最近记录: |