Python 掩蔽阵列上numpy.median的意外行为

Python 掩蔽阵列上numpy.median的意外行为,python,numpy,median,masked-array,Python,Numpy,Median,Masked Array,我有一个关于numpy.median()在使用numpy.ma.masked_array()创建的屏蔽数组上的行为的问题 正如我从调试自己的代码中了解到的,numpy.media()在屏蔽数组上无法按预期工作(有关问题的定义,请参阅) 提供的答复是: 说明:如果我没记错的话,np.median不支持子类,因此它无法在np.ma.MaskedArray上正常工作 因此,得出的结论是,为了计算屏蔽阵列中元素的中值,应使用numpy.ma.median(),因为这是专用于屏蔽阵列的中值函数 我的问题在

我有一个关于numpy.median()在使用numpy.ma.masked_array()创建的屏蔽数组上的行为的问题

正如我从调试自己的代码中了解到的,numpy.media()在屏蔽数组上无法按预期工作(有关问题的定义,请参阅)

提供的答复是:

说明:如果我没记错的话,np.median不支持子类,因此它无法在np.ma.MaskedArray上正常工作

因此,得出的结论是,为了计算屏蔽阵列中元素的中值,应使用
numpy.ma.median()
,因为这是专用于屏蔽阵列的中值函数

我的问题在于,我刚刚花了相当多的时间寻找这个问题,因为没有办法知道这个问题

尝试通过numpy.median()计算遮罩数组的中值时,不会引发任何警告或异常

此函数返回的答案与预期不符,当人们没有意识到这一点时,会导致严重问题

有人知道这是否被认为是一个bug吗

在我看来,预期的行为应该是在蒙版数组上使用numpy.median将引发某种异常

有什么想法吗

下面的测试脚本显示了在屏蔽数组上使用numpy.median的不必要和意外行为(请注意,有效元素的正确和预期中值为2.5!!!)

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
有人知道这是否被认为是一个bug吗

嗯,这是一只虫子!几个月前我在他们的问题追踪器()上发布了它


此行为的原因是
np.median
使用输入数组的
partition
方法,但不重写
partition
方法。因此,当在
np.median
中调用时,它只是默认为基本的
numpy.ndarray.partition
方法(这对于屏蔽数组来说是假的!)。

因此,您在这里的抱怨是
np.median
不起作用,但
np.ma.median
有点。。。我的抱怨是,它没有给出任何指示(甚至在文档中也没有),表明np.median在应用于屏蔽数组时给出了错误的结果。就我个人而言,由于有时过于草率,这个错误的np.中值将无法被检测到。因此,抱怨的不是np.ma.median有效,而是np.median没有在屏蔽阵列上给出任何错误结果的指示大量
np.
函数在屏蔽阵列上不能正确工作。问题是,
np.*
函数甚至不知道掩码数组的存在。我能在计算不正常的地方找到一个列表吗?函数不工作不是问题,而是它在没有警告/异常的情况下工作,但给出错误的结果。恐怕不存在这样的列表。您案例中的问题是
median
依赖于
partition
在中间点进行加密,对于屏蔽数组,我想不出一个好的
partition
定义