我在使用numpy.ma.masked_array()创建的蒙版数组上有关于numpy.median()行为的问题。
正如我通过调试自己的代码所理解的那样,numpy.median()在屏蔽数组上无法正常工作(有关问题的定义,请参阅Using numpy.median on a masked array)
提供的答案是:
说明:如果我没记错的话,np.median不支持子类,因此无法在np.ma.MaskedArray上正常工作。
因此,结论是,为了计算掩码数组中元素的中位数,使用numpy.ma.median()
,因为这是一个专用于掩码数组的中值函数。
我的问题在于我花了相当多的时间来发现这个问题,因为无法知道这个问题。
尝试通过numpy.median()计算掩码数组的中位数时,没有引发警告或异常。
此功能返回的答案并非预期,并且在人们不知道这一点时会引起严重问题。
有谁知道这可能被视为错误吗?
在我看来,预期的行为应该是在蒙面数组上使用numpy.median会引发某种异常。
任何想法???
下面的测试脚本显示了在屏蔽数组上使用numpy.median的不必要和意外行为(请注意,有效元素的正确和预期中值为2.5 !!!):< / p>
In [1]: import numpy as np
In [2]: test = np.array([1, 2, 3, 4, 100, 100, 100, 100])
In [3]: valid_elements = np.array([1, 1, 1, 1, 0, 0, 0, 0], dtype=np.bool)
In [4]: testm = np.ma.masked_array(test, ~valid_elements)
In [5]: testm
Out[5]:
masked_array(data = [1 2 3 4 -- -- -- --],
mask = [False False False False True True True True],
fill_value = 999999)
In [6]: np.median(test)
Out[6]: 52.0
In [7]: np.median(test[valid_elements])
Out[7]: 2.5
In [8]: np.median(testm)
Out[8]: 4.0
In [9]: np.ma.median(testm)
Out[9]: 2.5
答案 0 :(得分:3)
好吧,这是一个Bug!我几个月前在他们的问题跟踪器(Link to the bug report)上发布了它。有谁知道这可能被视为错误吗?
此行为的原因是np.median
使用输入数组的partition
方法,但np.ma.MaskedArray
不会覆盖partition
方法。因此,当np.median
中调用arr.partition
时,它只是默认使用基本的numpy.ndarray.partition
方法(这对于蒙版数组来说是假的!)。