numpy.ma(蒙面)数组均值方法具有不一致的返回类型

der*_*men 5 python numpy masked-array

我注意到numpy masked-array mean方法在它可能不应该返回时返回不同的类型:

import numpy as np

A = np.ma.masked_equal([1,1,0], value=0)
B = np.ma.masked_equal([1,1,1], value=0) # no masked values

type(A.mean())
#numpy.float64
type(B.mean())
#numpy.ma.core.MaskedArray
Run Code Online (Sandbox Code Playgroud)

其他numpy.ma.core.MaskedArray方法似乎是一致的

type( A.sum()) == type(B.sum())
# True
type( A.prod()) == type(B.prod())
# True
type( A.std()) == type(B.std())
# True
type( A.mean()) == type(B.mean())
# False
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

更新:正如评论中所指出的那样

C = np.ma.masked_array([1, 1, 1], mask=[False, False, False])
type(C.mean()) == type(A.mean())
# True 
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 1

B.mask以。。开始:

    if self._mask is nomask:
        result = super(MaskedArray, self).mean(axis=axis, dtype=dtype)
Run Code Online (Sandbox Code Playgroud)

np.ma.nomaskFalse

您的情况就是这样B

masked_array(data = [1 1 1],
             mask = False,
       fill_value = 0)
Run Code Online (Sandbox Code Playgroud)

掩码A是一个与大小匹配的数组data。其中B有一个标量 ,False并将mean其作为特殊情况处理。

我需要进一步挖掘才能了解这意味着什么。

In [127]: np.mean(B)
Out[127]: 
masked_array(data = 1.0,
             mask = False,
       fill_value = 0)

In [141]: super(np.ma.MaskedArray,B).mean()
Out[141]: 
masked_array(data = 1.0,
             mask = False,
       fill_value = 0)
Run Code Online (Sandbox Code Playgroud)

我不确定这有什么帮助;np.ndarray方法、np函数和方法之间存在一些循环引用np.ma,这使得很难准确识别正在使用的代码。它就像使用编译的mean方法,但如何处理屏蔽并不明显。

我想知道是否意图使用

 np.mean(B.data) # or
 B.data.mean()
Run Code Online (Sandbox Code Playgroud)

并且super方法 fetch 不是正确的方法。

在任何情况下,相同的数组,但带有向量掩码都会返回标量。

In [132]: C
Out[132]: 
masked_array(data = [1 1 1],
             mask = [False False False],
       fill_value = 0)

In [133]: C.mean()
Out[133]: 1.0
Run Code Online (Sandbox Code Playgroud)

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

在没有快捷方式的情况下尝试此方法nomask,会在之后引发错误

        dsum = self.sum(axis=axis, dtype=dtype)
        cnt = self.count(axis=axis)
        if cnt.shape == () and (cnt == 0):
            result = masked
        else:
            result = dsum * 1. / cnt
Run Code Online (Sandbox Code Playgroud)

self.count在这种情况下返回一个标量nomask,但np.int32在常规掩码中返回一个。所以cnt.shape窒息了。

trace是尝试此“快捷方式”的唯一其他屏蔽方法super(MaskedArray...)。平均代码显然有些混乱。

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

相关错误问题:https://github.com/numpy/numpy/issues/5769

据报道,去年这里提出了同样的问题:Testing equalence ofmeans of Numpy MaskedArrayInstances raises attribute error

看起来存在很多屏蔽问题,而不仅仅是mean. 开发大师现在或不久的将来可能会进行修复。