0

调试 python 包我遇到了以下问题:

在我为 numpy mean 函数提供掩码数组的病态情况下,返回类型是一个掩码数组:

>>> import numpy as np
>>> import numpy.ma as ma
>>> a=ma.array([1,2])
>>> np.mean(a)
masked_array(data = 1.5,
             mask = False,
       fill_value = 1e+20)

而如果我用相同的掩码数组提供 sum 函数,则返回类型是浮点数:

>>> np.sum(a)
3

有没有人知道这种行为是否是有意的,如果是这样,背后的原因是什么?

使用 python 版本 2.7.12 和 Python 3.5.2 测试。

4

1 回答 1

0

对于ma.mean文档中给出的示例,两者都返回标量

In [1217]: b = np.ma.array([1,2,3], mask=[False, False, True])
In [1218]: b.mean()
Out[1218]: 1.5
In [1219]: b.sum()
Out[1219]: 3

您的情况不同,因为掩码是标量False,而不是数组:

In [1220]: a=np.ma.array([1,2,3])
In [1221]: a
Out[1221]: 
masked_array(data = [1 2 3],
             mask = False,
       fill_value = 999999)
In [1222]: a.mean()
Out[1222]: 
masked_array(data = 2.0,
             mask = False,
       fill_value = 999999)
In [1223]: a.sum()
Out[1223]: 6

它真的不应该有所作为。我隐约记得看到过关于这个的讨论。我不记得它是在另一个 SO 中,还是在错误问题中。它也可能已修复。我们必须做一些搜索。我的 numpy 版本是 '1.11.0'

问题是 masked 开头的一行mean

if self._mask is nomask:
   result = super(MaskedArray, self).mean(axis=axis, dtype=dtype)

nomask是标量False;因此,在您的a情况下,它只是尝试执行常规的 numpy 均值,而不对该掩码执行任何特殊操作。但这会尝试返回与输入相同的子类的结果。

将掩码更改a为数组将“纠正”问题。

In [1247]: a.mask=[False,False,False]

===============

好的,副本隐藏在侧边栏中一目了然

numpy.ma(屏蔽)数组均值方法的返回类型不一致

去年七月我发现了一个错误问题,但没有补丁。

于 2016-10-24T21:47:57.303 回答