我注意到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
答案 0 :(得分:1)
B.mask
以:
if self._mask is nomask:
result = super(MaskedArray, self).mean(axis=axis, dtype=dtype)
np.ma.nomask
是False
。
您的B
masked_array(data = [1 1 1],
mask = False,
fill_value = 0)
对于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)
我不确定这有帮助; np.ndarray
方法与np
函数和np.ma
方法之间存在一些循环引用,这使得很难准确识别正在使用的代码。它喜欢使用编译的mean
方法,但是处理屏蔽的方式并不明显。
我想知道是否意图使用
np.mean(B.data) # or
B.data.mean()
并且super
方法提取不是正确的方法。
在任何情况下,相同的数组,但带有矢量掩码都会返回标量。
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.count
返回nomask
案例中的标量,但在常规屏蔽中返回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
。现在或在不久的将来,开发大师可能会有一些修复。