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

标签 python numpy masked-array

我注意到 numpy masked-array mean method可能不应该返回不同的类型:

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

其他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

谁能解释一下?

更新:正如评论中指出的

C = np.ma.masked_array([1, 1, 1], mask=[False, False, False])
type(C.mean()) == type(A.mean())
# True 

最佳答案

B.mask 开始于:

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

np.ma.nomaskFalse

您的 B 就是这种情况:

masked_array(data = [1 1 1],
             mask = False,
       fill_value = 0)

对于 A,掩码是一个与 data 大小匹配的数组。在 B 中,它是一个标量,Falsemean 将其作为特殊情况处理。

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

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)

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

不知是不是用意

 np.mean(B.data) # or
 B.data.mean()

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

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

在没有 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

self.countnomask 情况下返回标量,但在常规掩码情况下返回 np.int32。所以 cnt.shape 窒息了。

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

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

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

据此,去年这里提出了同样的问题:Testing equivalence of means of Numpy MaskedArray instances raises attribute error

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

关于python - numpy.ma(屏蔽)数组均值方法具有不一致的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38164773/

相关文章:

python - 打印 numpy 数组的全部内容

python - 用于屏蔽数组的 Numpy broadcast_to

python - 计算分割列表中不同长度矩阵的均值、方差、协方差

python - 查找相似/同义词/上下文单词 Python

python - Tensorflow 批处理 : keep result as strings

python - 根据第二个数组中的索引重新排列 numpy 数组

python - 如何更改 numpy 中屏蔽数组的值?

python - 如何在 python 中通过套接字发送字节?

python - Keras模型只能预测一个类

python - 如何在 float32 而不是 float64 上强制执行 python float 操作?