У меня есть 2d массива х, причем каждый ряд имеет различное число значений NaN:означают до 25 процентилей для строк массива, содержащего нан
array([[ nan, -0.355, -0.036, ..., nan, nan],
[ nan, -0.341, -0.047, ..., nan, 0.654],
[ .016, -1.147, -0.667, ..., nan, nan],
...,
[ nan, 0.294, -0.235, ..., 0.65, nan]])
С учетом этого массивом для каждой строки, я хочу вычислить среднее значение всех значений в пределах первых 25 процентов. Я делаю следующее:
limit = np.nanpercentile(x, 25, axis=1) # output 1D array
ans = np.nanmean(x * (x < limit[:,None]), axis=1)
Но это дает неправильные результаты - в частности, граф (np.nansum/np.nanmean) остается неизменным независимо от того, что процентиль я выбираю, потому что сравнение дает ноль, где не true, и подсчитывается как допустимое значение для среднего значения. Я не могу просто использовать x[x>limit[:,None]]
, потому что это дает 1D-массив, и мне нужен 2D-результат.
Я решил ее следующим образом:
f = x.copy()
f[f > limit[:,None]] = np.nan
ans = np.nanmean(f, axis=1)
Есть ли лучший подход к этому?
ли вы имеете в виду 'предел ', где вы написали' low'? Если так, то я думаю, что это именно та процедура, которую я бы тоже принял. Какой подход лучше всего вы ищете? – Praveen
спасибо, да, это предел. Желательно, чтобы подход без слишком большого количества промежуточных шагов, потому что с этим, мне нужно создать копию каждый раз, когда я хочу другой процентиль. – dayum