скучные ранддаты с замаскированным массивом - PullRequest
0 голосов
/ 28 июня 2018

Я замечаю следующее странное поведение с 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] во втором? Ошибка?

1 Ответ

0 голосов
/ 28 июня 2018

После трассировки я нахожу, что это связано с аргументом метода argsort из masked_array. Когда 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

Таким образом, в случае masked_array [1, 100], это argsorting [nan, 100], который равен [1, 0]. В случае masked_array [1, np.nan] это argsoring [nan, nan], который может быть [0,1]. Затем в функции rankdata предполагается, что первые n (n = 1) из аргумента argsort верны, что здесь неверно.

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