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().

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

  1. Мы импортировали NumPy, используя псевдоним

  2. Мы определили функцию square(), которая принимает одно число в качестве входного параметра и возвращает квадрат этого числа.

  3. Мы затем создали массив arr, используя функцию NumPy arange(), который содержит числа от 0 до 10.

  4. Мы затем передали этот массив в нашу функцию и присвоили его обратно нашему массиву

Так же, как в приведенном выше примере, мы можем использовать анонимную лямбда-функцию для отображения функций массивов. Давайте посмотрим, как мы можем пересоздать нашу функцию в виде простой лямбда-функции:

# Применение лямбда-функции к массивам 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 с использованием генератора списков.

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

  1. Мы создали наш массив,

  2. Мы объявили нашу лямбда-функцию для возведения значений в квадрат

  3. Мы затем использовали включение списка для итерации по каждому элементу массива и применения функции к каждому элементу.

  4. Мы затем передаем список в функцию np.array() для возвращения массива NumPy.

Заключение

В этом руководстве вы научились применять функцию к массиву NumPy. Сначала вы научились просто передавать массив в функцию, как для одномерных, так и для двумерных массивов. Затем вы узнали, как использовать функцию vectorize() из NumPy для преобразования других функций в векторные функции. После этого вы научились использовать функцию map() из Python, циклы for и понимание списков для применения функции к массиву NumPy.

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

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

Last updated