Numpy: BUG:在具有mask = nomask的视图上设置遮罩不会传播给所有者

创建于 2016-06-27  ·  4评论  ·  资料来源: numpy/numpy

这是我在工作中遇到的问题
面罩未设置时的问题

>>> 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'

我知道我的系统不是最新的,但是我问一个朋友
他确认问题存在

00 - Bug numpy.ma

最有用的评论

每当我想到nomask ,我也会想到Donald Knuth所说的话:“过早的优化是万恶之源。”

在我看来, nomask也不例外。 一个人从这种行为中遇到的异常情况的数量非常多,因此,使它们更难解决。

如果知道遮罩是否微不足道真是一件富有成效的事情,我们可以轻松地使用has_mask这样的方法来缓存其结果。

是否有兴趣彻底删除nomask

所有4条评论

在主站(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。 我很少使用屏蔽数组,因此这是需要此功能的人最好的方法。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

kevinzhai80 picture kevinzhai80  ·  4评论

toddrjen picture toddrjen  ·  4评论

Foadsf picture Foadsf  ·  3评论

astrofrog picture astrofrog  ·  4评论

thouis picture thouis  ·  4评论