带有掩码数组的scipy rankdata

时间:2018-06-28 19:10:36

标签: scipy ranking masked-array

我注意到使用maksed_array的rankdata有以下奇怪行为。这是代码:

import numpy as np
import scipy.stats as stats

m = [True, False]
print(stats.mstats.rankdata(np.ma.masked_array([1.0, 100], mask=m)))
# result [0. 1.]

print(stats.mstats.rankdata(np.ma.masked_array([1.0, np.nan], mask=m)))
# result [1. 0.]

print(stats.mstats.rankdata([1.0, np.nan]))
# result [1. 2.]

根据样式doc,掩码值将分配为0(use_missing = False)。那么为什么要在第二个输出[1 0]呢?错误吗?

1 个答案:

答案 0 :(得分:0)

跟踪之后,我发现它与masked_array的argsort method有关。当mstats.rankdata调用argsort时,它不指定fill_value,也不以输入参数结尾,它们分别默认为np.nan和True。根据numpy的以下代码,fill_value为np.nan。

if fill_value is None:
    if endwith:
        # nan > inf
        if np.issubdtype(self.dtype, np.floating):
            fill_value = np.nan

因此,在masked_array为[1,100]的情况下,它对[nan,100]进行argsorting,即[1,0]。对于masked_array为[1,np.nan]的情况,它要求[nan,nan]为arg,可以是[0,1]。然后在rankdata函数中,假定argsort中的前n个(n = 1)是有效的,此处不正确。

n = data.count()
rk = np.empty(data.size, dtype=float)
idx = data.argsort()
rk[idx[:n]] = np.arange(1,n+1)