2017-02-22 66 views
2

我有一个问题,有关numpy.median()在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 !!!)

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

因此,您的抱怨是'np.median'不起作用,但'np.ma.median'呢? – Eric

+0

...我的抱怨是,它没有给出任何迹象(即使在文档中)np.median在将其应用于蒙版数组时给出错误结果。对我个人来说,有时候会很sl,,这个错误的np.median值将不被发现。所以,抱怨并不是说np.ma.median能够工作,但是np.median并没有在掩模阵列上给出错误结果的任何迹象。 –

+0

大量的'np。*'函数在掩码阵列上无法正常工作。问题是,'np。*'函数甚至不知道掩码数组存在。 – Eric

回答

3

有谁知道这可能被认为是一个错误?

那么,这是一个错误!我几个月前在他们的问题追踪器上发布了它()。

此行为的原因是np.median使用输入数组的partition方法,但np.ma.MaskedArray不覆盖partition方法。因此,当arr.partitionnp.median中被调用时,它只是默认为基本的numpy.ndarray.partition方法(这是伪造数组伪造的!)。