这是我在工作中遇到的问题
面罩未设置时的问题
>>> a =np.arange(6,dtype=np.float64).reshape((2,3))
>>> a
array([[ 0., 1., 2.],
[ 3., 4., 5.]])
>>> am = np.ma.masked_array(a)
>>> am
masked_array(data =
[[ 0. 1. 2.]
[ 3. 4. 5.]],
mask =
False,
fill_value = 1e+20)
>>> am[0][1]=np.ma.masked
>>> am
masked_array(data =
[[ 0. 1. 2.]
[ 3. 4. 5.]],
mask =
False,
fill_value = 1e+20)
###--------- doesn't work----------------
>>> am[0,1]=np.ma.masked
>>> am
masked_array(data =
[[0.0 -- 2.0]
[3.0 4.0 5.0]],
mask =
[[False True False]
[False False False]],
fill_value = 1e+20)
###-------this way it works---------
>>> am[1][1]=np.ma.masked
>>> am
masked_array(data =
[[0.0 -- 2.0]
[3.0 -- 5.0]],
mask =
[[False True False]
[False True False]],
fill_value = 1e+20)
###--------now it surprisingly works again--
Linux 3.19.8-100.fc20.x86_64
Python 2.7.5
>>> np.__version__
'1.8.2'
我知道我的系统不是最新的,但是我问一个朋友
他确认问题存在
在主站(1.12)中确认。 这就像#5580希望解决的问题一样,但是如此处所讨论的,如果不对MaskedArray进行大修以删除np.nomask
就无法解决此特殊情况。
这是问题所在:MaskedArrays有时将掩码存储为布尔数组,有时(如果没有掩码值)将掩码存储为值False
(和np.nomask == False)。
问题在于,在对MaskedArray进行切片(并获取视图)时,如果当前是布尔数组,则只能“查看”该遮罩,而如果它是常量“ False”,则不能“遮罩”。 因此,第一次尝试am[0][1] = ...
,掩码是常量“ False”,无法查看,因此不会更新。 第二次尝试,将掩码存储为布尔数组,以便可以对其进行查看并进行更新。
将此添加到此nomask
设计引起的一长串错误中,例如#7588。
每当我想到nomask
,我也会想到Donald Knuth所说的话:“过早的优化是万恶之源。”
在我看来, nomask
也不例外。 一个人从这种行为中遇到的异常情况的数量非常多,因此,使它们更难解决。
如果知道遮罩是否微不足道真是一件富有成效的事情,我们可以轻松地使用has_mask
这样的方法来缓存其结果。
是否有兴趣彻底删除nomask
?
我很想知道我也遇到了这个问题。 可能值得在文档中添加注释。 以下内容向我建议修改视图的蒙版将修改原始蒙版。
访问切片时,输出是被掩码的数组,其
data
属性是原始数据的视图,并且其掩码为nomask
(如果原始数组中没有无效条目)或原始蒙版的相应切片的视图。 需要该视图以确保将蒙版的任何修改传播到原始蒙版。
是否有兴趣彻底清除无掩膜?
也许也masked
。 这可能归因于对掩码数组进行了一些重大更改,或者完全实现了一个新类。 可能值得组建一个NEP。 我很少使用屏蔽数组,因此这是需要此功能的人最好的方法。
最有用的评论
每当我想到
nomask
,我也会想到Donald Knuth所说的话:“过早的优化是万恶之源。”在我看来,
nomask
也不例外。 一个人从这种行为中遇到的异常情况的数量非常多,因此,使它们更难解决。如果知道遮罩是否微不足道真是一件富有成效的事情,我们可以轻松地使用
has_mask
这样的方法来缓存其结果。是否有兴趣彻底删除
nomask
?