numpy.ma公司(掩码)数组平均值方法的返回类型不正确

2024-09-25 10:18:21 发布

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

我注意到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方法似乎是一致的

^{pr2}$

有人能解释一下吗?在

更新:如评论所述

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

Tags: coreimportnumpyfalse类型valuetypenp
1条回答
网友
1楼 · 发布于 2024-09-25 10:18:21

B.mask开头为:

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

np.ma.nomaskFalse。在

这是您的B的情况:

^{pr2}$

对于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。现在或不久的将来,开发主控中可能会有修复程序。在

相关问题 更多 >