Numpy遮罩数组实例均值等价性测试引发属性

2024-09-25 10:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑1:

到目前为止,这似乎是一个错误,是在版本1.8.1和1.9.2之间添加的。我还没有找到根本原因。在1.8.1中np.ma.MaskedArray.mean()将返回一个标量。在1.9.2中,它返回一个零维MaskedArray。只有当foo.mask设置为np.ma.nomask时,才会出现这种情况。你知道吗

编辑2:

I have submitted this as a bug here.

我试图追踪这个问题,但是在跟踪MaskedArray.mean()的继承时遇到了困难。具体来说,我对numpy/core中的2711行有困难/从数字.py当用MaskedArray实例调用时,它似乎回调到MaskedArray.mean()。你知道吗

原始问题:

我可能在做一些有趣的事情,但我似乎找不到问题所在。当我测试np.ma.MaskedArray的两个不同实例的平均值的等价性时,会产生一个AttributeError。你知道吗

创建数组:

In [1]: import numpy as np

In [2]: foo = np.ma.array([1,2,3,4])

In [3]: bar = np.ma.array([1,2,3,4])

In [4]: foo.mean()
Out[4]: 
masked_array(data = 2.5,
             mask = False,
       fill_value = 1e+20)


In [5]: bar.mean()
Out[5]: 
masked_array(data = 2.5,
             mask = False,
       fill_value = 1e+20)

比较数组效果很好:

In [6]: foo == bar
Out[6]: 
masked_array(data = [ True  True  True  True],
             mask = False,
       fill_value = True)

测试平均值的等效性失败:

In [7]: foo.mean() == bar.mean()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-3b824b0972e3> in <module>()
----> 1 foo.mean() == bar.mean()

/users/___/.local/lib/python2.7/site-packages/numpy/ma/core.pyc in __eq__(self, other)
   3705                         mask = np.all([[f[n].all() for n in mask.dtype.names]
   3706                                         for f in mask], axis=axis)
-> 3707                 check._mask = mask
   3708         return check
   3709     #

AttributeError: 'numpy.bool_' object has no attribute '_mask'

In [8]: foo.mean() != bar.mean()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-0947fa5da1ed> in <module>()
----> 1 foo.mean() != bar.mean()

/users/___/.local/lib/python2.7/site-packages/numpy/ma/core.pyc in __ne__(self, other)
   3738                         mask = np.all([[f[n].all() for n in mask.dtype.names]
   3739                                         for f in mask], axis=axis)
-> 3740                 check._mask = mask
   3741         return check
   3742     #

测试较大或较小的平均值效果良好:

AttributeError: 'numpy.bool_' object has no attribute '_mask'

In [9]: foo.mean() >= bar.mean()
Out[9]: 
masked_array(data = True,
             mask = False,
       fill_value = True)


In [10]: foo.mean() <= bar.mean()
Out[10]: 
masked_array(data = True,
             mask = False,
       fill_value = True)

Python版本2.7.2和Numpy版本1.9.2:

In [11]: np.__version__
Out[11]: '1.9.2'

似乎在np.ma.MaskedArray.__ne__()中,变量check由一行创建,如下所示:

check = np.ndarray.__eq__(foo.filled(0), bar.filled(0)).view(type(foo))

我希望返回一个新的屏蔽数组。但是,由于np.ndarray.__eq__()返回np.bool_的实例。试图对check创建MaskedArray视图只会生成另一个np.bool_实例。由于np.bool_没有_mask属性,因此例程尝试分配给check._mask时发生错误。你知道吗

你知道这是怎么回事吗?是我的错误还是愚蠢?你知道吗


Tags: innumpytruefoochecknpbarmask