NumPy: Лучшие способы применения функции к массиву
В этом учебнике вы научитесь использовать NumPy для применения функции к каждому элементу массива с использованием различных методов, таких как NumPy vectorize. Умение применять одну и ту же функцию к каждому элементу массива является важным навыком. Однако, поскольку массивы NumPy часто могут быть довольно большими, мы должны учитывать производительность при маппинге функций к массивам NumPy.
К концу этого руководства вы узнаете:
Как применять функции к одномерным и двумерным массивам NumPy
Как использовать функцию векторизации NumPy для сопоставления функции с массивом
Как использовать циклы for и списки списков для применения функции к каждому элементу массива NumPy
Оглавление
Как лучше всего сопоставить функцию с массивом NumPy
Лучший способ применить функцию к массиву NumPy — это напрямую передать массив в функцию. Это не только самый простой способ, но и наиболее читаемый метод. Данный метод подходит для массивов любой размерности.
Погрузимся в то, как работает этот метод, сначала рассмотрев, как применить функцию к одномерному массиву в следующем разделе.
Сопоставьте функцию с одномерным массивом NumPy
Простейший способ применить функцию к одномерному массиву - это просто передать массив в функцию. Эта функция может быть встроенной функцией, пользовательской функцией, или анонимной функцией lambda.
Давайте рассмотрим создание пользовательской функции, которая возводит число в квадрат. Затем мы можем передать массив NumPy в эту функцию, чтобы посмотреть, что произойдет.
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square()
.
Давайте разберемся, что мы сделали в приведенном выше коде:
Мы импортировали NumPy, используя псевдоним
Мы определили функцию
square()
, которая принимает одно число в качестве входного параметра и возвращает квадрат этого числа.Мы затем создали массив
arr
, используя функцию NumPy arange(), который содержит числа от 0 до 10.Мы затем передали этот массив в нашу функцию и присвоили его обратно нашему массиву
Так же, как в приведенном выше примере, мы можем использовать анонимную лямбда-функцию для отображения функций массивов. Давайте посмотрим, как мы можем пересоздать нашу функцию в виде простой лямбда-функции:
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную лямбда-функцию square
.
Пример выше показывает, что поведение кода аналогично использованию пользовательской функции. Однако вместо этого мы используем лямбда-функцию. Теперь, когда вы знаете, как применять функции к одномерным массивам NumPy, давайте посмотрим, как мы можем сделать это для двумерных массивов.
Сопоставьте функцию с двумерным массивом NumPy
Применение функции к каждому элементу в двумерном массиве NumPy работает так же, как и с одномерными массивами. Мы можем просто передать массив в функцию и отобразить каждый элемент с помощью этой функции. Давайте посмотрим, как это работает:
Этот код создает двумерный массив arr
размером 2x5, а затем применяет к каждому элементу квадратную лямбда-функцию square
.
Из приведённого выше блока кода видно, что функция применяется к каждому элементу массива. Такой подход довольно типичен для Python и позволяет нам быть очень целенаправленными в нашем коде.
Как использовать векторизацию NumPy для сопоставления функции с массивом
Функция vectorize()
в NumPy - это удобная функция, предоставляемая NumPy для создания функций, которые могут быть применены к массивам NumPy. Функция преобразует другую функцию для того, чтобы применить ее к массивам NumPy.
Следует отметить, что функция не предназначена для высокой производительности. Она просто проходит циклом по каждому элементу массива и обрабатывает его. Из-за этого, данный подход не рекомендуется как самый эффективный. Давайте посмотрим, как мы можем векторизовать нашу предыдущую функцию и применить её к каждому элементу массива.
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square
с помощью функции np.vectorize()
.
По сути, это не делает намного больше, чем наши предыдущие примеры. Фактически, это добавляет шаг к нашей обработке данных и может привести к некоторому неожиданному поведению при работе с более сложными функциями.
Как использовать карту Python для сопоставления функции с массивом NumPy
Python включает встроенную функцию для применения функций к элементам итерируемых объектов, map()
. Эта функция позволяет легко применять функции к каждому элементу в итерируемом объекте без необходимости явно писать цикл for. Давайте посмотрим, как мы можем использовать эту функцию для применения функции к каждому элементу массива:
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square
с помощью функции map()
и затем преобразует результат в массив NumPy.
В приведенном выше блоке кода мы создали массив и лямбда-функцию. Затем мы передали функцию и массив в функцию Python map()
соответственно. Поскольку функция map()
возвращает объект map, нам нужно преобразовать его обратно в массив NumPy, используя конструктор
Как использовать циклы For для сопоставления функции с массивом NumPy
В этом разделе вы узнаете, как использовать цикл for в Python для применения функции к каждому элементу в массиве NumPy. Этот метод выполняет то же самое, что и функция векторизации NumPy, и может быть более понятен для читателей вашего кода.
Давайте посмотрим, как мы можем это сделать:
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square
с использованием цикла for.
В приведенном выше блоке кода мы сначала создали наш массив и функцию, которую хотим применить. Затем мы прошлись циклом по каждому элементу в массиве и добавили его в новый массив. Мы манипулируем каждым элементом в массиве, получая доступ к значению массива напрямую в цикле for. Мы присваиваем значение отображаемому значению, возвращаемому нашей функцией.
Вы можете упростить этот код, используя генератор списка, о котором рассказывается в следующем разделе.
Как использовать списки для сопоставления функции с массивом NumPy
Мы можем упростить метод выше, используя понимание списка, чтобы заменить наш цикл for. Мы можем использовать понимание списка для создания нового списка значений, где каждый элемент отображается в функцию. Чтобы превратить это обратно в массив NumPy, нам нужно передать его в функцию конструктора
Этот код создает массив arr
от 0 до 10, а затем применяет к каждому элементу квадратную функцию square
с использованием генератора списков.
Давайте разберем, что мы сделали в приведенном выше блоке кода:
Мы создали наш массив,
Мы объявили нашу лямбда-функцию для возведения значений в квадрат
Мы затем использовали включение списка для итерации по каждому элементу массива и применения функции к каждому элементу.
Мы затем передаем список в функцию
np.array()
для возвращения массива NumPy.
Заключение
В этом руководстве вы научились применять функцию к массиву NumPy. Сначала вы научились просто передавать массив в функцию, как для одномерных, так и для двумерных массивов. Затем вы узнали, как использовать функцию vectorize()
из NumPy для преобразования других функций в векторные функции. После этого вы научились использовать функцию map()
из Python, циклы for и понимание списков для применения функции к массиву NumPy.
Дополнительные ресурсы
Чтобы узнать больше о схожих темах, ознакомьтесь с нижеследующими учебными пособиями:
Last updated