NumPy: Лучшие способы применения функции к массиву
В этом учебнике вы научитесь использовать NumPy для применения функции к каждому элементу массива с использованием различных методов, таких как NumPy vectorize. Умение применять одну и ту же функцию к каждому элементу массива является важным навыком. Однако, поскольку массивы NumPy часто могут быть довольно большими, мы должны учитывать производительность при маппинге функций к массивам NumPy.
К концу этого руководства вы узнаете:
Как применять функции к одномерным и двумерным массивам NumPy
Как использовать функцию векторизации NumPy для сопоставления функции с массивом
Как использовать циклы for и списки списков для применения функции к каждому элементу массива NumPy
Оглавление
Как лучше всего сопоставить функцию с массивом NumPy
Лучший способ применить функцию к массиву NumPy — это напрямую передать массив в функцию. Это не только самый простой способ, но и наиболее читаемый метод. Данный метод подходит для массивов любой размерности.
Погрузимся в то, как работает этот метод, сначала рассмотрев, как применить функцию к одномерному массиву в следующем разделе.
Сопоставьте функцию с одномерным массивом NumPy
Простейший способ применить функцию к одномерному массиву - это просто передать массив в функцию. Эта функция может быть встроенной функцией, пользовательской функцией, или анонимной функцией lambda.
Давайте рассмотрим создание пользовательской функции, которая возводит число в квадрат. Затем мы можем передать массив NumPy в эту функцию, чтобы посмотреть, что произойдет.
# Применение пользовательской функции к массивам NumPy
import numpy as np
def square(num):
return num ** 2
arr = np.arange(11)
arr = square(arr)
print(arr)
# Returns: [ 0 1 4 9 16 25 36 49 64 81 100]
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square()
.
Давайте разберемся, что мы сделали в приведенном выше коде:
Мы импортировали NumPy, используя псевдоним
Мы определили функцию
square()
, которая принимает одно число в качестве входного параметра и возвращает квадрат этого числа.Мы затем создали массив
arr
, используя функцию NumPy arange(), который содержит числа от 0 до 10.Мы затем передали этот массив в нашу функцию и присвоили его обратно нашему массиву
Так же, как в приведенном выше примере, мы можем использовать анонимную лямбда-функцию для отображения функций массивов. Давайте посмотрим, как мы можем пересоздать нашу функцию в виде простой лямбда-функции:
# Применение лямбда-функции к массивам NumPy
import numpy as np
square = lambda x: x ** 2
arr = np.arange(11)
arr = square(arr)
print(arr)
# Returns: [ 0 1 4 9 16 25 36 49 64 81 100]
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную лямбда-функцию square
.
Пример выше показывает, что поведение кода аналогично использованию пользовательской функции. Однако вместо этого мы используем лямбда-функцию. Теперь, когда вы знаете, как применять функции к одномерным массивам NumPy, давайте посмотрим, как мы можем сделать это для двумерных массивов.
Сопоставьте функцию с двумерным массивом NumPy
Применение функции к каждому элементу в двумерном массиве NumPy работает так же, как и с одномерными массивами. Мы можем просто передать массив в функцию и отобразить каждый элемент с помощью этой функции. Давайте посмотрим, как это работает:
# Применение лямбда-функции к двумерным массивам NumPy
import numpy as np
square = lambda x: x ** 2
arr = np.arange(10).reshape(2, 5)
arr = square(arr)
print(arr)
# Returns:
# [[ 0 1 4 9 16]
# [25 36 49 64 81]]
Этот код создает двумерный массив arr
размером 2x5, а затем применяет к каждому элементу квадратную лямбда-функцию square
.
Из приведённого выше блока кода видно, что функция применяется к каждому элементу массива. Такой подход довольно типичен для Python и позволяет нам быть очень целенаправленными в нашем коде.
Как использовать векторизацию NumPy для сопоставления функции с массивом
Функция vectorize()
в NumPy - это удобная функция, предоставляемая NumPy для создания функций, которые могут быть применены к массивам NumPy. Функция преобразует другую функцию для того, чтобы применить ее к массивам NumPy.
Следует отметить, что функция не предназначена для высокой производительности. Она просто проходит циклом по каждому элементу массива и обрабатывает его. Из-за этого, данный подход не рекомендуется как самый эффективный. Давайте посмотрим, как мы можем векторизовать нашу предыдущую функцию и применить её к каждому элементу массива.
# Использование функции np.vectorize() для отображения функции на массив
import numpy as np
square = lambda x: x ** 2
vectorized_square = np.vectorize(square)
arr = np.arange(11)
arr = vectorized_square(arr)
print(arr)
# Returns: [ 0 1 4 9 16 25 36 49 64 81 100]
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square
с помощью функции np.vectorize()
.
По сути, это не делает намного больше, чем наши предыдущие примеры. Фактически, это добавляет шаг к нашей обработке данных и может привести к некоторому неожиданному поведению при работе с более сложными функциями.
Как использовать карту Python для сопоставления функции с массивом NumPy
Python включает встроенную функцию для применения функций к элементам итерируемых объектов, map()
. Эта функция позволяет легко применять функции к каждому элементу в итерируемом объекте без необходимости явно писать цикл for. Давайте посмотрим, как мы можем использовать эту функцию для применения функции к каждому элементу массива:
# Использование функции map() Python для отображения функции на массив NumPy
import numpy as np
arr = np.arange(11)
square = lambda x: x ** 2
mapped = np.array(list(map(square, arr)))
print(mapped)
# Returns: [ 0 1 4 9 16 25 36 49 64 81 100]
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square
с помощью функции map()
и затем преобразует результат в массив NumPy.
В приведенном выше блоке кода мы создали массив и лямбда-функцию. Затем мы передали функцию и массив в функцию Python map()
соответственно. Поскольку функция map()
возвращает объект map, нам нужно преобразовать его обратно в массив NumPy, используя конструктор
Как использовать циклы For для сопоставления функции с массивом NumPy
В этом разделе вы узнаете, как использовать цикл for в Python для применения функции к каждому элементу в массиве NumPy. Этот метод выполняет то же самое, что и функция векторизации NumPy, и может быть более понятен для читателей вашего кода.
Давайте посмотрим, как мы можем это сделать:
# Использование цикла for для отображения функции на массив NumPy
import numpy as np
arr = np.arange(11)
square = lambda x: x ** 2
for idx in range(len(arr)):
arr[idx] = square(arr[idx])
print(arr)
# Returns: [ 0 1 4 9 16 25 36 49 64 81 100]
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square
с использованием цикла for.
В приведенном выше блоке кода мы сначала создали наш массив и функцию, которую хотим применить. Затем мы прошлись циклом по каждому элементу в массиве и добавили его в новый массив. Мы манипулируем каждым элементом в массиве, получая доступ к значению массива напрямую в цикле for. Мы присваиваем значение отображаемому значению, возвращаемому нашей функцией.
Вы можете упростить этот код, используя генератор списка, о котором рассказывается в следующем разделе.
Как использовать списки для сопоставления функции с массивом NumPy
Мы можем упростить метод выше, используя понимание списка, чтобы заменить наш цикл for. Мы можем использовать понимание списка для создания нового списка значений, где каждый элемент отображается в функцию. Чтобы превратить это обратно в массив NumPy, нам нужно передать его в функцию конструктора
# Использование генератора списков для отображения функции на массив NumPy
import numpy as np
arr = np.arange(11)
square = lambda x: x ** 2
arr = np.array([square(val) for val in arr])
print(arr)
# Returns: [ 0 1 4 9 16 25 36 49 64 81 100]
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square
с использованием генератора списков.
Давайте разберем, что мы сделали в приведенном выше блоке кода:
Мы создали наш массив,
Мы объявили нашу лямбда-функцию для возведения значений в квадрат
Мы затем использовали включение списка для итерации по каждому элементу массива и применения функции к каждому элементу.
Мы затем передаем список в функцию
np.array()
для возвращения массива NumPy.
Заключение
В этом руководстве вы научились применять функцию к массиву NumPy. Сначала вы научились просто передавать массив в функцию, как для одномерных, так и для двумерных массивов. Затем вы узнали, как использовать функцию vectorize()
из NumPy для преобразования других функций в векторные функции. После этого вы научились использовать функцию map()
из Python, циклы for и понимание списков для применения функции к массиву NumPy.
Дополнительные ресурсы
Чтобы узнать больше о схожих темах, ознакомьтесь с нижеследующими учебными пособиями:
Last updated