Это сделает две копии, но вы должны попробовать, потому что это должно быть очень быстро.
def trimmed_std(data, low, high):
tmp = np.asarray(data)
return tmp[(low <= tmp) & (tmp < high)].std()
Нужно ли выполнять обрезку рангов (то есть, обрезать на 5%)?
Обновление:
Если вам нужно обрезать процентили, лучший способ, который я могу придумать, - это сначала отсортировать данные. Примерно так должно работать:
def trimmed_std(data, percentile):
data = np.array(data)
data.sort()
percentile = percentile / 2.
low = int(percentile * len(data))
high = int((1. - percentile) * len(data))
return data[low:high].std(ddof=0)
Очевидно, что вы можете реализовать это без использования numpy, но даже с учетом времени преобразования списка в массив использование numpy быстрее, чем все, что я мог придумать.