NumPy: вычисления и устройство массивов

View и copy: предсказание влияния изменений среза на исходный массив

Содержание курса

Проверка общей памяти через np.shares_memory

Понять концептуально, что view разделяет память с оригиналом, — хорошо. Но когда нужно убедиться в этом программно, есть конкретный инструмент: np.shares_memory(a, b).

Функция возвращает True, если массивы a и b делят хотя бы один общий байт памяти. Если их данные полностью независимы — вернёт False. Никакого анализа значений, никаких сравнений элементов — только проверка адресов.

import numpy as np

a = np.array([10, 20, 30, 40, 50])

# Срез — view: данные общие
v = a[1:4]
print(np.shares_memory(a, v))   # True

Теперь создадим копию через .copy() и проверим то же самое:

c = a[1:4].copy()
print(np.shares_memory(a, c))   # False

.copy() запрашивает у NumPy новый кусок памяти и копирует туда значения. После этого c — полностью самостоятельный объект. Связи с a на уровне байтов нет, и np.shares_memory это честно подтверждает.

Важный момент: .copy() можно вызывать как на срезе, так и на целом массиве. Оба варианта дают одинаковый результат — независимое хранилище:

full_copy = a.copy()
print(np.shares_memory(a, full_copy))   # False

np.shares_memory стоит использовать как основной инструмент всякий раз, когда есть сомнение: «это view или копия?». Сравнение значений здесь не поможет — при создании view и copy содержат одинаковые числа, разница только в том, где они хранятся.