# NumPy: Лучшие способы применения функции к массиву

В этом учебнике вы научитесь использовать NumPy для применения функции к каждому элементу массива с использованием различных методов, таких как NumPy vectorize. Умение применять одну и ту же функцию к каждому элементу массива является важным навыком. Однако, поскольку массивы NumPy часто могут быть довольно большими, мы должны учитывать производительность при маппинге функций к массивам NumPy.

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

* Как применять функции к одномерным и двумерным массивам NumPy
* Как использовать функцию векторизации NumPy для сопоставления функции с массивом
* Как использовать циклы for и списки списков для применения функции к каждому элементу массива NumPy

Оглавление

* [Как лучше всего сопоставить функцию с массивом NumPy](#kak-luchshe-vsego-sopostavit-funkciyu-s-massivom-numpy)
* [Сопоставьте функцию с одномерным массивом NumPy](#sopostavte-funkciyu-s-odnomernym-massivom-numpy)
* [Сопоставьте функцию с двумерным массивом NumPy](#sopostavte-funkciyu-s-dvumernym-massivom-numpy)
* [Как использовать векторизацию NumPy для сопоставления функции с массивом](#kak-ispolzovat-vektorizaciyu-numpy-dlya-sopostavleniya-funkcii-s-massivom)
* [Как использовать карту Python для сопоставления функции с массивом NumPy](#kak-ispolzovat-kartu-python-dlya-sopostavleniya-funkcii-s-massivom-numpy)
* [Как использовать циклы For для сопоставления функции с массивом NumPy](#kak-ispolzovat-cikly-for-dlya-sopostavleniya-funkcii-s-massivom-numpy)
* [Как использовать списки для сопоставления функции с массивом NumPy](#kak-ispolzovat-spiski-dlya-sopostavleniya-funkcii-s-massivom-numpy)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Как лучше всего сопоставить функцию с массивом NumPy

**Лучший способ применить функцию к массиву NumPy — это напрямую передать массив в функцию**. Это не только самый простой способ, но и наиболее читаемый метод. Данный метод подходит для массивов любой размерности.

Погрузимся в то, как работает этот метод, сначала рассмотрев, как применить функцию к одномерному массиву в следующем разделе.

### Сопоставьте функцию с одномерным массивом NumPy

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

Давайте рассмотрим создание пользовательской функции, которая возводит число в квадрат. Затем мы можем передать массив NumPy в эту функцию, чтобы посмотреть, что произойдет.

```python
# Применение пользовательской функции к массивам 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. Мы затем передали этот массив в нашу функцию и присвоили его обратно нашему массиву

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

```python
# Применение лямбда-функции к массивам 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 работает так же, как и с одномерными массивами. Мы можем просто передать массив в функцию и отобразить каждый элемент с помощью этой функции. Давайте посмотрим, как это работает:

```python
# Применение лямбда-функции к двумерным массивам 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.

Следует отметить, что функция не предназначена для высокой производительности. Она просто проходит циклом по каждому элементу массива и обрабатывает его. Из-за этого, данный подход не рекомендуется как самый эффективный. Давайте посмотрим, как мы можем векторизовать нашу предыдущую функцию и применить её к каждому элементу массива.

```python
# Использование функции 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. Давайте посмотрим, как мы можем использовать эту функцию для применения функции к каждому элементу массива:

```python
# Использование функции 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, и может быть более понятен для читателей вашего кода.

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

```python
# Использование цикла 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, нам нужно передать его в функцию конструктора

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

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

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

* [Индексирование и нарезка массивов NumPy: полное руководство](numpy-arange-polnoe-rukovodstvo-s-primerami)
* [Как нормализовать массивы NumPy](kak-normalizovat-massivy-numpy-minimalnoe-maksimalnoe-masshtabirovanie-z-ocenka-l2)
* [NumPy где: обрабатывать элементы массива условно](numpy-where-uslovnaya-obrabotka-elementov-massiva)
* [Векторизация NumPy: официальная документация](https://numpy.org/doc/stable/reference/generated/numpy.vectorize.html)
