Основы манипуляции массивами NumPy

NumPyNumPyBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии вы изучите основы работы с массивами NumPy. NumPy - это мощная библиотека для численных вычислений в Python. Она предоставляет эффективные структуры данных и функции для выполнения математических операций над массивами.

Примечание: Вы можете писать код в 06-copies-and-views.ipynb. В некоторых шагах опущены некоторые операции вывода, и вы можете выводить результат по необходимости.

Разбор копирования и представлений

Массивы NumPy состоят из двух частей: буфера данных и метаданных. Буфер данных содержит фактические элементы данных, в то время как метаданные включают такие сведения, как тип данных и шаг.

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

  • Представление позволяет обращаться к массиву по-разному, изменив некоторые метаданные, не меняя при этом буфер данных. Любые изменения, внесенные в представление, будут отражаться в исходном массиве.

  • Копия - это новый массив, который дублирует и буфер данных, и метаданные. Внесенные изменения в копию не повлияют на исходный массив.

Создание представлений

Представления можно создать, изменив некоторые метаданные массива. Это создает новый способ просмотра данных без их копирования. Чтобы создать представление, можно использовать метод view() объекта ndarray.

import numpy as np

## Создать массив
x = np.array([1, 2, 3, 4, 5])

## Создать представление
y = x.view()

## Изменить представление
y[0] = 10

## Распечатать исходный массив
print(x)  ## Вывод: [10, 2, 3, 4, 5]

В приведенном выше примере представление y позволяет нам изменить исходный массив x.

Создание копий

Копии можно создать путем дублирования как буфера данных, так и метаданных массива. Чтобы создать копию, можно использовать метод copy() объекта ndarray.

import numpy as np

## Создать массив
x = np.array([1, 2, 3, 4, 5])

## Создать копию
y = x.copy()

## Изменить копию
y[0] = 10

## Распечатать исходный массив
print(x)  ## Вывод: [1, 2, 3, 4, 5]

В приведенном выше примере копия y независима от исходного массива x.

Операции индексирования

Операции индексирования в NumPy могут создавать либо представления, либо копии, в зависимости от типа индексирования.

  • Базовое индексирование всегда создает представления. Например:
import numpy as np

## Создать массив
x = np.arange(10)

## Создать представление
y = x[1:3]

## Изменить представление
y[0] = 10

## Распечатать исходный массив
print(x)  ## Вывод: [0, 10, 2, 3, 4, 5, 6, 7, 8, 9]

В приведенном выше примере представление y отражает изменения, внесенные в исходный массив x.

  • Расширенное индексирование всегда создает копии. Например:
import numpy as np

## Создать массив
x = np.arange(9).reshape(3, 3)

## Создать копию
y = x[[1, 2]]

## Изменить исходный массив
x[[1, 2]] = [[10, 11, 12], [13, 14, 15]]

## Распечатать копию
print(y)  ## Вывод: [[3, 4, 5], [6, 7, 8]]

В приведенном выше примере копия y остается неизменной после изменения исходного массива x.

Другие операции

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

  • Функция reshape() создает представление, если это возможно, или копию в противном случае. Например:
import numpy as np

## Создать массив
x = np.ones((2, 3))

## Транспонировать массив
y = x.T

## Попытка изменить форму массива
try:
    y.shape = 6
except AttributeError:
    print("Incompatible shape for in-place modification. Use `.reshape()` to make a copy with the desired shape.")

В приведенном выше примере массив y становится не непрерывным после транспонирования, поэтому изменение его формы требует копирования.

  • Функция ravel() возвращает непрерывное сглаженное представление массива, если это возможно. С другой стороны, метод flatten() всегда возвращает сглаженную копию массива. Например:
import numpy as np

## Создать массив
x = np.arange(9).reshape(3, 3)

## Создать сглаженное представление
y = x.ravel()

## Создать сглаженную копию
z = x.flatten()

## Распечатать исходный массив
print(x)  ## Вывод: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]

В приведенном выше примере y - это представление, а z - копия.

Определение, является ли массив представлением или копией

Вы можете использовать атрибут base объекта ndarray, чтобы определить, является ли массив представлением или копией. Атрибут base возвращает исходный массив для представления и None для копии. Например:

import numpy as np

## Создать массив
x = np.arange(9)

## Создать представление
y = x.reshape(3, 3)

## Создать копию
z = y[[2, 1]]

## Проверить, является ли y представлением
print(y.base)  ## Вывод: [0, 1, 2, 3, 4, 5, 6, 7, 8]

## Проверить, является ли z копией
print(z.base is None)  ## Вывод: True

В приведенном выше примере y - это представление, а z - копия.

Резюме

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

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