# Руководство по индексации и срезам массивов NumPy: Полное руководство

Это полное руководство научит вас всем различным способам индексации и среза массивов NumPy. NumPy является необходимой библиотекой для любого аналитика данных или ученого-данных, использующего Python. Эффективная индексация и срезание массивов NumPy могут сделать вас более сильным программистом.

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

* Как работает индексирование и нарезка массива NumPy
* Как индексировать одномерные, двумерные и трехмерные массивы
* Как разрезать массивы NumPy, используя диапазоны, условия и т. д.

Оглавление

* [Понимание индексации массива NumPy](#ponimanie-indeksacii-massiva-numpy)
  * [Как получить доступ к одномерным элементам массива NumPy с помощью индексации](#kak-poluchit-dostup-k-odnomernym-elementam-massiva-numpy-s-pomoshyu-indeksacii)
  * [Как получить доступ к элементам двумерного массива NumPy с помощью индексации](#kak-poluchit-dostup-k-elementam-dvumernogo-massiva-numpy-s-pomoshyu-indeksacii)
  * [Как получить доступ к элементам трехмерного массива NumPy с помощью индексации](#kak-poluchit-dostup-k-elementam-trekhmernogo-massiva-numpy-s-pomoshyu-indeksacii)
* [Нарезка и перемещение массивов NumPy](#narezka-i-peremeshenie-massivov-numpy)
* [Индексирование целочисленного массива в NumPy для доступа к нескольким элементам](#indeksirovanie-celochislennogo-massiva-v-numpy-dlya-dostupa-k-neskolkim-elementam)
* [Логическое индексирование в массивах NumPy для условной нарезки](#logicheskoe-indeksirovanie-v-massivakh-numpy-dlya-uslovnoi-narezki)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Понимание индексации массива NumPy

Так же, как и при работе со списками Python, **массивы NumPy основаны на индексации с нуля**. Это означает, что индексация начинается с позиции 0 и продолжается до длины списка минус 1. Точно так же массивы NumPy могут индексироваться отрицательно, что означает, что к их последнему элементу можно обратиться, используя значение

Массивы NumPy выходят за рамки базовых списков Python благодаря наличию ряда особенностей. Тем не менее, многие функции, доступные для списков Python (такие как индексация и срезы), также применимы к массивам NumPy.

#### Как получить доступ к одномерным элементам массива NumPy с помощью индексации

Давайте посмотрим, как мы можем получить доступ к первому элементу в массиве NumPy, используя стандартный синтаксис Python `x[obj]`, где `x` - это массив, а `obj` - это выбор:

```python
# Получение первого элемента в массиве NumPy
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[0])

# Returns: 1
```

Этот код выводит первый элемент массива NumPy `arr`.

В приведенном выше коде мы смогли получить доступ к первому элементу, индексируя индекс 0. Аналогично, мы можем получить доступ к последнему элементу в массиве NumPy, используя индекс -1, как показано ниже:

```python
# Получение последнего элемента в массиве NumPy
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[-1])

# Returns: 5
```

Этот код выводит последний элемент массива NumPy `arr`.

Теперь, когда вы научились индексировать одномерные массивы, давайте посмотрим, как можно получить доступ к элементам посредством индексации в двумерных массивах.

#### Как получить доступ к элементам двумерного массива NumPy с помощью индексации

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

```python
# Получение первого элемента во втором массиве NumPy
import numpy as np

arr = np.array([
    [1, 2, 3],
    [4, 5, 6]
])
print(arr[1][0])

# Returns: 4
```

Этот код выводит первый элемент второго массива в массиве NumPy `arr`.

Мы видим, что, получив доступ к индексу 0, а затем к индексу 1, мы можем получить доступ ко второму элементу первого массива. Этот подход работает так же, как и доступ к элементам во вложенных списках.

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

```python
# Получение первого элемента во втором массиве NumPy (альтернативный метод)
import numpy as np

arr = np.array([
    [1, 2, 3],
    [4, 5, 6]
])
print(arr[1, 0])

# Returns: 4
```

Этот код также выводит первый элемент второго массива в массиве NumPy `arr`, но использует индексацию с использованием одной пары квадратных скобок для обращения к элементу.

Этот подход значительно упрощает код. Передавая один индексный элемент, содержащий два объекта, мы можем обращаться к нескольким измерениям. Этот метод также более эффективен – он работает без создания нового, временного массива

Кроме того, вы можете комбинировать это с отрицательной индексацией. Это может быть особенно полезно, когда вы не знаете, сколько элементов в массиве! Давайте посмотрим, как мы можем получить доступ к последнему элементу первого массива:

```python
# Использование отрицательной индексации с двумерными массивами
import numpy as np

arr = np.array([
    [1, 2, 3],
    [4, 5, 6]
])
print(arr[0, -1])

# Returns: 3
```

Этот код выводит последний элемент первого массива в массиве NumPy `arr` с использованием отрицательной индексации для обращения к элементу.

Это позволяет вам комбинировать как положительные, так и отрицательные индексы при индексации массива.

Теперь, когда вы научились работать с двумерными массивами, давайте рассмотрим индексацию трехмерных массивов.

#### Как получить доступ к элементам трехмерного массива NumPy с помощью индексации

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

```python
# Доступ к элементам в трехмерных массивах NumPy
import numpy as np

arr = np.array([
    [
        [1, 2],
        [3, 4]
    ],
    [
        [5, 6],
        [7, 8]
    ]
])
print(arr[-1, 0, 0])

# Returns: 5
```

Этот код выводит первый элемент первого массива в последнем массиве в массиве NumPy `arr` с использованием отрицательной индексации.

В приведенном выше примере мы создаем массив формы `(2, 2, 2)`. **Способ работы индексации заключается в том, что доступ к данным осуществляется снаружи внутрь**. В данном случае мы обращаемся к последнему массиву, затем к первому массиву и, наконец, к первому значению - возвращая значение 5.

### Нарезка и перемещение массивов NumPy

Аналогично спискам в Python, вы можете использовать срезы и шаги для работы с массивами NumPy. Это позволяет обращаться сразу к нескольким элементам массива, начиная с определенной позиции и заканчивая другой, с заданным интервалом. Давайте рассмотрим более простой пример, где мы получаем доступ к элементам, начиная со второго и заканчивая предпоследним:

```python
# Срезы массивов NumPy
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[1:-1])

# Returns: [2 3 4]
```

Этот код выводит срез массива NumPy `arr` с элементами, начиная со второго и заканчивая предпоследним.

При использовании среза возвращаются значения массива **от начала и до (но не включая)** конечного значения

Значение до или после двоеточия `:` является необязательным: если число опущено, то массив разделен от первого до последнего элементов соответственно.

**Мы также можем перебирать массив с определенным интервалом, используя третий, необязательный аргумент в срезе**. Это следует за соглашением `[start : stop : stride]`, где stride по умолчанию равно 1. Давайте посмотрим, как мы можем перебирать массив NumPy с первого до последнего элемента с интервалом в 2:

```python
# Шаговый доступ к массиву NumPy
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[::2])

# Returns: [1 3 5]
```

Этот код выводит каждый второй элемент массива NumPy `arr`.

В следующем разделе вы узнаете, как использовать индексацию массивов целых чисел в NumPy для доступа к нескольким элементам.

### Индексирование целочисленного массива в NumPy для доступа к нескольким элементам

Вы можете легко получить доступ к нескольким элементам в массиве NumPy, используя для индексации список элементов. Это позволяет легко получить доступ к нескольким элементам, не нуждаясь в многократном индексировании массива.

Давайте посмотрим, как это делается, получив доступ к первому и третьему элементам массива:

```python
# Индексирование нескольких элементов в массиве NumPy
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[[0, 2]])

# Returns: [1 3]
```

Этот код выводит элементы массива NumPy `arr` с индексами 0 и 2.

Важно отметить, что при индексировании вы передаете список значений (обратите внимание на двойные квадратные скобки).

Этот метод также работает с отрицательными индексами, как показано ниже:

```python
# Индексирование нескольких элементов в массиве NumPy
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[[0, 2]])

# Returns: [1 5]
```

Этот код выводит элементы массива NumPy `arr` с индексами 0 и 2.

Аналогично, порядок индексов не обязательно должен быть последовательным! Вы можете получать доступ к элементам в любом порядке, который захотите. В примере ниже мы сначала получаем доступ к третьему элементу, а затем к первому:

```python
# Индексирование нескольких элементов в массиве NumPy с использованием не последовательных индексов
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[[2, 0]])

# Returns: [3 1]
```

Этот код выводит элементы массива NumPy `arr` с индексами 2 и 0.

В следующем разделе вы узнаете, как использовать индексацию с помощью булевых значений в массивах NumPy для условного среза.

### Логическое индексирование в массивах NumPy для условной нарезки

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

```python
# Использование логического индексирования в массивах NumPy
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[arr < 3])

# Returns: [1 2]
```

Этот код выводит элементы массива NumPy `arr`, которые меньше 3, используя логическое индексирование.

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

1. Мы создаем булев массив, оценивая выражение `arr < 3`, что возвращает массив булевых значений элементов, соответствующих условию.
2. Используем этот булев массив для индексации, возвращая только значения меньше 3

Аналогично, этот метод можно использовать для более сложной фильтрации. Например, если мы хотим вернуть только четные элементы, мы можем использовать оператор модуло для фильтрации нашего массива:

```python
# Использование логического индексирования для четных значений
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[arr % 2 == 0])

# Returns: [2 4]
```

Этот код выводит четные элементы массива NumPy `arr`, используя логическое индексирование.

### Заключение

В этом учебном пособии вы научились индексировать массивы NumPy. Сначала вы научились использовать простое индексирование, которое позволяет получить доступ к отдельному значению. Затем вы научились работать с двумерными и трехмерными массивами. После этого вы изучили, как делать срезы и шаги по массивам NumPy, аналогично работе со списками Python. Наконец, вы научились использовать мощное булево индексирование, чтобы индексировать массивы на основе условия.

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

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

* [Сглаживание массива с помощью NumPy](https://bemind.gitbook.io/neural/uchebniki-po-pandas-i-numpy/pandas/kak-rasschitat-skolzyashee-srednee-srednee-arifmeticheskoe-v-pandas)
* [NumPy где: обрабатывать элементы массива условно](https://bemind.gitbook.io/neural/uchebniki-po-pandas-i-numpy/numpy/numpy-where-uslovnaya-obrabotka-elementov-massiva)
* [NumPy linspace: создание равномерно расположенных массивов с помощью np.linspace](https://bemind.gitbook.io/neural/uchebniki-po-pandas-i-numpy/numpy/numpy-linspace-sozdanie-ravnomerno-raspolozhennykh-massivov-s-pomoshyu-np.linspace)
* [Официальная документация: индексирование NumPy](https://numpy.org/doc/stable/user/basics.indexing.html#basic-indexing)
