NumPy where: Условная обработка элементов массива

В этом руководстве вы узнаете, как использовать функцию NumPy where() для обработки или возвращения элементов на основе одного условия или нескольких условий. Функция np.where() является одной из самых мощных функций, доступных в NumPy. Функция позволяет возвращать индексы, где условие выполнено, или обрабатывать элементы массива, где условие выполнено. К сожалению, эта функция часто плохо документирована и недостаточно используется – это руководство призвано исправить это.

К концу этого руководства вы научитесь:

  • Что такое функция NumPywhere() и как понять ее параметры

  • Как заменить элементы в массиве с помощью функции NumPywhere()

  • Как обрабатывать элементы массива с помощью функции NumPywhere()

  • Как использовать функцию np.where() с несколькими условиями

  • Как использовать функцию np.where() для возврата индексов при выполнении условия

Оглавление

Понимание функции np.where()

Перед тем, как мы начнем использовать функцию np.where(), давайте посмотрим, что это за функция и какие параметры она предлагает. Функция описывается как "Возврат элементов, выбранных из x или y в зависимости от условия" в официальной документации.

Это означает, что функция может возвращать элементы из другого набора массивов, x или y, в зависимости от выполнения условия в передаваемом массиве a. Если это все еще вызывает путаницу, не волнуйтесь – приведенные ниже примеры помогут развеять все сомнения.

Давайте рассмотрим синтаксис функции

# Понимание функции np.where()
numpy.where(
  condition,   # Если истина, возвращает x, иначе y
  [x, y, ]  )   # Значения для выбора

Функция np.where() возвращает значения из x, если условие condition истинно, и значения из y в противном случае. Массивы x и y должны иметь одинаковую форму или быть скалярами.

  • condition: Булев массив или условие, которое определяет, где выбрать значения из x или y.

  • x: Массив значений, которые будут выбраны там, где условие истинно.

  • y: Массив значений, которые будут выбраны там, где условие ложно.

Функция np.where() возвращает новый массив, содержащий выбранные значения из x

Синтаксис функции может показаться немного запутанным. Приведенные ниже примеры должны помочь более четко разобраться с использованием функции. Давайте погрузимся в примеры!

Использование np.where() для замены элементов в массиве NumPy

Одно из самых простых применений функции np.where() - это замена значений в массиве. Давайте рассмотрим пример, а затем разберем, что мы сделали:

# Использование np.where() для замены элементов в массиве
import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
replaced = np.where(arr > 5, 'Met', 'Not Met')
print(replaced)

# Возвращает:
# ['Not Met' 'Not Met' 'Not Met' 'Not Met' 'Not Met' 'Met' 'Met' 'Met' 'Met' 'Met']

Этот код заменяет элементы в массиве arr на 'Met', если они больше 5, и на 'Not Met' в противном случае, и сохраняет результат в переменной replaced.

Давайте разберем, что мы сделали выше:

  1. Мы загрузили numpy под псевдонимом

  2. Мы создали массив arr, который включает значения от 1 до 10.

  3. Затем мы создали другой массив, replaced, который использует функцию np.where() для замены значений в нашем массиве,

Функция транслирует массив условий и возвращает значения либо из первого, либо из второго массива.

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

# Использование np.where() для замены элементов в массиве другими значениями из массива
import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
replaced = np.where(arr > 5, arr, -1)
print(replaced)

# Возвращает:
# [-1 -1 -1 -1 -1  6  7  8  9 10]

Этот код заменяет элементы в массиве arr на сами элементы, если они больше 5, и на -1 в противном случае, и сохраняет результат в переменной replaced.

Аналогично, мы можем использовать два массива в функции np.where() и выбирать из одного или другого массива в зависимости от выполнения условия.

Использование np.where() для обработки элементов массива NumPy

В этом разделе вы научитесь использовать функцию np.where() для обработки элементов в массиве NumPy. Это может быть очень полезно, когда вы хотите применить расчет на основе выполнения условия.

Давайте посмотрим, как это работает на Python:

# Использование np.where() для обработки элементов в массиве
import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
replaced = np.where(arr % 2 == 0, arr * 10, arr / 10)
print(replaced)

# Возвращает:
# [  0.1  20.    0.3  40.    0.5  60.    0.7  80.    0.9 100. ]

Этот код умножает на 10 элементы массива arr, которые четные, и делит на 10 элементы, которые нечетные, и сохраняет результат в переменной replaced.

В приведенном выше коде мы определяем, является ли каждый элемент четным значением (используя оператор модуля). Если элемент четный, мы умножаем значение на 10. В противном случае мы делим число на 10. Это может быть отличным способом изменения массивов на основе условия.

Важно отметить, что в нашем примере измененные значения были получены из исходного массива. Однако это необязательное условие! Мы можем использовать два разных массива и обрабатывать их разными способами.

Допустим, у нас есть список значений, которые идентифицируют объект как квадрат или круг. У нас также есть массив, который содержит либо радиус круга, либо длину стороны квадрата. Мы можем использовать функцию np.where() для возврата массива площадей, как показано ниже:

# Использование np.where() с практическим примером
import numpy as np

types = ['square', 'circle', 'square', 'circle', 'circle', 'square']
arr = np.array([2.3, 3.4, 1.2, 5.4, 3.2, 1.1])
areas = np.where(types == 'square', arr ** 2, np.pi * arr ** 2)
print(areas)

# Возвращает:
# [16.61902514 36.31681108  4.52389342 91.60884178 32.16990877  3.80132711]

Этот код вычисляет площадь для каждой фигуры в массиве arr, где тип фигуры равен 'square', используя формулу сторона ** 2, а для фигур типа 'circle', используется формула pi * радиус ** 2, и сохраняет результат в переменной areas.

В приведенном выше примере мы работали с двумя массивами: один содержал информацию о форме объекта, а другой - некоторые измерения этого объекта. Мы смогли использовать функцию np.where() для расчета площади объекта, используя соответствующую формулу.

Использование np.where() с несколькими условиями

В этом разделе вы узнаете, как использовать функцию np.where() с несколькими условиями. Это значительно расширяет возможности использования функции.

Давайте рассмотрим, как мы можем расширить предыдущий пример: мы можем вернуть значение, если оно больше пяти и чётное, — в противном случае вернуть 0.

# Использование np.where() с несколькими условиями
import numpy as np

arr = np.arange(10)

filtered = np.where((arr % 2 == 0) & (arr > 5), arr, 0)
print(filtered)

# Возвращает: [0 0 0 0 0 0 6 0 8 0]

Этот код создает новый массив filtered, в котором значения из массива arr сохраняются, если они четные и больше 5, иначе они заменяются на 0.

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

Мы также можем выбирать элементы, если выполнено хотя бы одно из условий, используя оператор |. Давайте посмотрим, как это выглядит:

# Использование np.where() с несколькими условиями и оператором |
import numpy as np

arr = np.arange(10)

filtered = np.where((arr % 2 == 0) | (arr > 5), arr, 0)
print(filtered)

# Возвращает: [0 0 2 0 4 0 6 7 8 9]

Этот код создает новый массив filtered, в котором значения из массива arr сохраняются, если они четные или больше 5, иначе они заменяются на 0.

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

Использование np.where() с несколькими измерениями

В этом разделе мы рассмотрим использование функции np.where() с массивами нескольких измерений. На самом деле это работает так же, как и для массивов только одного измерения. Давайте посмотрим, как мы можем использовать матрицу с функцией

# Использование функции np.where() с матрицей NumPy
import numpy as np

arr = np.arange(9).reshape(3, 3)

filtered = np.where(arr % 2 == 0, arr, -1)
print(filtered)

# Возвращает:
# [[ 0 -1  2]
#  [-1  4 -1]
#  [ 6 -1  8]]

Этот код создает новую матрицу, где значения из исходной матрицы arr сохраняются, если они четные, иначе они заменяются на -1.

В приведенном выше примере мы возвращаем значение из исходного массива, если оно четное, иначе возвращаем

Использование np.where() для возврата индексов, в которых выполняется условие

Функция np.where() также может использоваться для того, чтобы возвращать только индексы массива, соответствующие заданному условию. Это возможно, когда не передаются массивы результатов. Возвращаемым массивом является просто массив индексов, которые соответствуют условию.

Давайте посмотрим, как мы можем это сделать на Python:

# Использование np.where() для возврата индексов, где условие выполняется
import numpy as np

arr = np.arange(9)

idx = np.where(arr % 2 == 0)
print(idx)

# Возвращает:
# (array([0, 2, 4, 6, 8]),)

Этот код возвращает индексы элементов массива arr, для которых условие остатка от деления на 2 равно 0.

Заключение

В этом учебнике вы научились использовать функцию np.where() для выбора и трансформации элементов в массиве, которые соответствуют условию. Сначала вы научились понимать синтаксис функции, а затем проработали простой пример. Затем вы научились использовать функцию для замены и трансформации элементов в массиве. Вы также научились использовать функцию с несколькими условиями и с массивами нескольких измерений. Наконец, вы научились использовать функцию для возврата индексов массива, которые соответствуют условию.

Дополнительные ресурсы

Чтобы узнать больше о смежных темах, ознакомьтесь с нижеследующими руководствами:

Last updated