View и copy: где ловят баги
Вопрос
Объясните разницу между представлением и копией в NumPy. Как это приводит к багам и как их избежать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
View делит память с исходным массивом, меняется данные обоих
Срезы дают view, fancy indexing и маски дают копию
Баг: изменили срез и испортили исходные данные
Баг: большой массив держится в памяти из-за маленького среза (base)
Защита: явный `.copy()`, проверка `np.shares_memory`
Связь с pandas: Copy-on-Write в pandas 3.0 убрал эту неоднозначность для DataFrame
Что могут спросить следом
- Как проверить, делят ли массивы память?
- Почему
reshapeиногда копирует? - Что изменилось в pandas 3.0 с Copy-on-Write?
Разбор
Представление это новый объект-массив, который смотрит в ту же память, что и исходный, просто с другой формой, сдвигом или шагами. Базовые срезы, .T, reshape по возможности возвращают view, а индексирование списком индексов, булевой маской и арифметика создают новый массив. Первый класс багов: взяли срез для «временной» обработки, нормировали его на месте и незаметно испортили исходные данные. Второй: оставили маленький срез от гигантского массива, и вся большая память не освобождается, потому что срез держит ссылку через base. Защищаюсь явным .copy(), когда собираюсь менять данные, и проверкой np.shares_memory в тестах. В pandas аналогичная путаница давала SettingWithCopyWarning, в pandas 3.0 её закрыл Copy-on-Write: любая выборка ведёт себя как копия.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «NumPy: массивы и векторизация»
- Что значит axis=0
- Broadcasting: форма результата
- Обрезка выбросов по перцентилям
- Скользящее среднее через cumsum
- Попарные расстояния через broadcasting
- Стандартизация столбцов матрицы (z-score)
- Запись float в целочисленный массив
- Fancy indexing возвращает копию