На этом шаге мы приведем код, решающий задачу, сформулированную на предыдущем шаге, и разберем принцип его работы.
Вот и все, что нужно знать для решения следующей задачи (пример 3.20): заменить каждое седьмое значение в заданном массиве значений температуры средним значением за последние семь дней (включая значение этого седьмого дня).
## Зависимости import numpy as np ## Данные ## Данные с датчиков (Пнд, Вт, Ср, Чт, Пт, Сб, Вс) tmp = np.array([1, 2, 3, 4, 3, 4, 4, 5, 3, 3, 4, 3, 4, 6, 6, 5, 5, 5, 4, 5, 5]) ## Однострочник tmp[6::7] = np.average(tmp.reshape((-1, 7)), axis=1) ## Результат print(tmp)
Можете вычислить результат выполнения этого фрагмента кода?
Исходные данные поступили в виде одномерного массива показаний датчиков.
Во-первых, мы создали массив tmp, содержащий одномерную последовательность показаний датчиков. В каждой строке описано семь значений измерений датчиков для семи дней недели.
Во-вторых, с помощью присваивания срезу мы заменяем все воскресные значения этого массива. Поскольку воскресенье - седьмой день, мы выбираем соответствующие воскресенью значения, начиная с седьмого элемента исходного массива tmp, с помощью выражения tmp[6::7].
В-третьих, мы изменяем форму нашего одномерного массива показаний датчиков на двумерный массив, содержащий семь столбцов и три строки, что упрощает вычисление средней температуры за неделю, для замены воскресных данных. Благодаря изменению формы мы можем теперь агрегировать все семь значений каждой строки в одно среднее значение. Для изменения формы передаем в tmp.reshape() кортеж значений -1 и 7, указывая тем самым NumPy, что количество строк (ось координат 0) необходимо вычислить автоматически. Проще говоря, мы указываем, что столбцов должно быть семь, а NumPy создает массив с таким количеством строк, которое бы удовлетворяло этому условию. В нашем случае после смены формы получается следующий массив:
print(tmp.reshape((-1,7))) # [[1 2 3 4 3 4 4] # [5 3 3 4 3 4 6] # [6 5 5 5 4 5 5]]
У нас теперь есть по строке для каждой недели и по столбцу для каждого дня недели.
Теперь можно вычислить среднее значение за семь дней, схлопнув каждую строку в одно число с помощью функции np.average() с аргументом axis=1, указывающим NumPy схлопнуть вторую ось в одно среднее значение. Обратите внимание, что значение за воскресенье также включено в вычисляемое среднее (см. постановку задачи в начале предыдущего шага). Ниже представлен результат правой половины уравнения:
print(np.average(tmp.reshape((-1,7)), axis=1)) # [3. 4. 5.]
Задача нашего однострочника состоит в замене трех воскресных значений температуры. Все остальные значения менять не нужно. Посмотрим, как можно добиться этого. После замены всех воскресных показаний датчиков окончательный результат работы нашего однострочника должен выглядеть следующим образом:
# [1 2 3 4 3 4 3 5 3 3 4 3 4 4 6 5 5 5 4 5 5]
Обратите внимание, что в итоге получается снова одномерный массив NumPy со всеми показаниями датчиков температуры. Но все "неправильные" значения заменены теми, которые лучше отражают реальность.
Резюмируя: данный однострочник иллюстрирует понятие формы массива и ее изменения, а также использование свойства axis в агрегирующих функциях наподобие np.average(). И несмотря на некоторую специфичность этого конкретного их приложения, они могут пригодиться во множестве ситуаций. Далее мы расскажем вам о чрезвычайно широком понятии: сортировке в NumPy.
На следующем шаге мы рассмотрим когда использовать в NumPy функцию sort(), а когда - argsort().