Я рассчитываю реализовать быстро движущуюся медиану, так как мне приходится делать много медиан для моей программы.Я хотел бы использовать встроенные функции Python, поскольку они были бы более оптимизированы, чем то, что я мог бы сделать.
Моя медиана должна сделать: - извлечь 5 значений, - удалить центральное, - найти медиану оставшихся 4значения.
В основном несколько вызовов:
numpy.median(np.array([0, 1, 2, 3, 4])[np.array([True, True, False, True, True])])
# (1. + 3.) / 2. = 2.0
Я нашел две функции: scipy generic_filter и numpy median_filter.Моя проблема в том, что generic_filter дает правильный вывод, а не median_filter, даже если кажется, что они имеют одинаковые параметры.Более того, generic_filter медленнее, чем median_filter.Поэтому я хотел бы знать, что я делаю неправильно в моем вызове median_filter, и использовать его для целей скорости.
import numpy as np
import scipy.ndimage as sc
v = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(sc.generic_filter(v, sc.median, footprint=np.array([1, 1, 0, 1, 1]), mode = "mirror", output=np.float64))
%timeit sc.generic_filter(v, sc.median, footprint=np.array([1, 1, 0, 1, 1]), mode = "mirror", output=np.float64)
print(sc.median_filter(v, footprint=np.array([1, 1, 0, 1, 1]), output=np.float64, mode="mirror"))
%timeit sc.median_filter(v, footprint=np.array([1, 1, 0, 1, 1]), output=np.float64, mode="mirror")
Как видите, generic_filter дает правильный вывод: [1.5 1.5 2. 34. 5. 6. 7. 8. 8.5 8.5] 327 мкс ± 15,2 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1000 циклов каждый)
, и median_filter быстрее, но я нене понимаю его вывод: [2.2. 3. 4. 5. 6. 7. 8. 9. 9. 9.] 12,4 мкс ± 217 нс на цикл (среднее ± стандартное отклонение из 7 циклов, 100000 циклов каждый)
DoВы знаете, что не так с моим звонком?