Шаг 42.
Однострочники Python. ... . Очистка каждого i-го элемента массива с помощью транслирования, присваивания срезу и изменения формы. Общее описание

    На этом шаге мы научимся производить небольшие операции очистки для устранения ошибочных точек данных, так как реальные данные редко бывают "чистыми" по многим причинам, включая поврежденные и сбойные датчики, они могут содержать ошибки и пропущенные значения.

Общее описание

    Представьте, что вы установили в саду датчик температуры. Каждое воскресенье вы приносите его домой для снятия показаний. А значит, отдаете себе отчет в неточности воскресных показаний, поскольку часть дня они отражают температуру в доме, а не в саду.

    Вы хотели бы очистить данные, заменив все воскресные показания датчика средним значением за предыдущие семь дней (воскресное показание вы тоже учитываете, поскольку нельзя сказать, что оно совсем неточное). Прежде чем заняться кодом, посмотрим, что нам понадобится для работы.

Присваивание срезам

    При использовании возможности присваивания срезам NumPy с левой стороны уравнения указываются значения, которые необходимо заменить, а справа - значения, которыми их заменяют. В примерее 3.18 приведен небольшой пример, который освежит вашу память.


Пример 3.18. Простой пример создания списка и присваивания срезу
import numpy as np

a = np.array([4] * 16) 
print(a)
# [4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4]

a[1::] = [42] * 15 
print(a)
# [ 4 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42]

    Этот фрагмент кода создает массив, в котором 16 раз повторяется значение 4. С помощью присваивания срезу мы заменяем последние 15 значений на 42. Напомним, что нотация а[начало:конец:шаг] служит для выбора последовательности, начинающейся с индекса начало, оканчивающейся на индексе конец (не включая его), причем состоящей только из элементов шаг последовательности. Если какие-либо из этих параметров не указаны, NumPy использует значения по умолчанию. Нотация a[1::] заменяет все элементы последовательности, кроме первого. В примере 3.19 показано, как применять присваивание срезу вместе с уже неоднократно встречавшейся вам функциональной возможностью.


Пример 3.19. Присваивание срезу в NumPy
import numpy as np

a = np.array([4] * 16)
a[1:8:2] = 16 
print(a)
# [ 4 16 4 16 4 16 4 16 4 4 4 4 4 4 4 4]

    Здесь мы заменяем каждое второе значение между индексами 1 и 8 (не включая последний). Как видите, для замены выбранных элементов достаточно указать единственное значение, 16, благодаря - да, вы правы! - транслированию. Правая сторона уравнения автоматически преобразуется в массив NumPy той же формы, что и массив слева.

Изменение формы

    Прежде чем говорить о нашем однострочнике, вам нужно познакомиться с важной функцией NumPy - x.reshape((a,b)), - которая преобразует массив NumPy x в новый массив NumPy с a строк и b столбцов (то есть формы (a,b)). Пример выглядит так:


a = np.array([1, 2, 3, 4, 5, 6]) 
print(a.reshape((2, 3)))
# [[1 2 3] 
# [4 5 6]]

    Если количество столбцов определяется однозначно, можно позволить NumPy сделать это автоматически. Пусть нам нужно изменить форму массива из шести элементов на двумерный массив из двух строк. NumPy может сама вычислить, исходя из равного 6 количества элементов исходного массива, что столбцов должно быть три. Пример таков:


a = np.array([1, 2, 3, 4, 5, 6]) 
print(a.reshape((2, -1)))
# [[1 2 3]
#  [4 5 6]]

    Значение -1 для соответствующего столбцам аргумента функции reshape() указывает NumPy на необходимость заменить его правильным количеством столбцов (в данном случае три).

Аргумент axis

    Наконец, рассмотрим следующий фрагмент кода, в котором вы познакомитесь с аргументом axis. Пусть дан массив solar_x с ежедневными котировками компании SolarX Илона Маска. Мы хотим вычислить средний курс акций утром, днем и вечером. Как это реализовать?


import numpy as np

# Котировки акций по дням
# [утро, полдень, вечер] 
solar_x = np.array(
   [[1, 2, 3], # сегодня 
    [2, 2, 5]]) # вчера
# Полдень - взвешенное среднее 
print(np.average(solar_x, axis=0))
# [1.5 2. 4.]

    Массив solar_x состоит из курсов акций компании SolarX. Он включает две строки (по одной на день) и три столбца (по одному на каждый курс акций). Пусть нам нужно вычислить средний курс акций для утра, дня и вечера. В общих чертах мы хотим схлопнуть все значения в каждом столбце путем их усреднения. Другими словами, вычислить среднее значение по оси 0. Именно это и означает аргумент axis=0.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг