0

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

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.]

根据 scipy doc,掩码值将被分配 0 (use_missing=False)。那么为什么它在第二个输出 [1 0] 呢?漏洞?

4

1 回答 1

0

跟踪后发现它与 masked_array 的 argsort方法有关。mstats.rankdata调用argsort时,不指定fill_value和endwith输入参数,分别默认为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

所以对于[1, 100]的masked_array来说,就是argsorting [nan, 100],也就是[1, 0]。在[1,np.nan]的masked_array的情况下,是argsoring[nan,nan],可以是[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)
于 2018-06-28T20:30:35.357 回答