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

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

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

  • Как работает индексирование и нарезка массива NumPy

  • Как индексировать одномерные, двумерные и трехмерные массивы

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

Оглавление

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

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

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

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

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

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

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

# Returns: 1

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

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

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

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

# Returns: 5

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

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

Как получить доступ к элементам двумерного массива 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.

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

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

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

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

# Returns: 4

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

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

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

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

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

# Returns: 3

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

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

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

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

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

# Доступ к элементам в трехмерных массивах 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. Это позволяет обращаться сразу к нескольким элементам массива, начиная с определенной позиции и заканчивая другой, с заданным интервалом. Давайте рассмотрим более простой пример, где мы получаем доступ к элементам, начиная со второго и заканчивая предпоследним:

# Срезы массивов 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:

# Шаговый доступ к массиву 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, используя для индексации список элементов. Это позволяет легко получить доступ к нескольким элементам, не нуждаясь в многократном индексировании массива.

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

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

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

# Returns: [1 3]

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

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

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

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

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

# Returns: [1 5]

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

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

# Индексирование нескольких элементов в массиве 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:

# Использование логического индексирования в массивах 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

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

# Использование логического индексирования для четных значений
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. Наконец, вы научились использовать мощное булево индексирование, чтобы индексировать массивы на основе условия.

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

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

Last updated