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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bemind.gitbook.io/neural/uchebniki-po-pandas-i-numpy/numpy/numpy-luchshie-sposoby-primeneniya-funkcii-k-massivu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
