Перезапись памяти массива Numpy на месте

Большинство функций numpy возвращают новый объект массива, например нули(). Если вы хотите перезаписать элементы существующего массива, вам нужно сделать это с помощью прямого присваивания (например, array[:] = 0).

Andrew Holmgren 10.04.2023 18:07

Ваша первая ссылка, «документация», предназначена для пользователей C-API, а вторая — для cython, поэтому они имеют для вас ограниченное значение. Весь мой ответ в последней ссылке говорит вам, как определить, «где» хранятся данные. Ни один из них не говорит вам, какие операции изменяют существующие данные, а не возвращают новый массив.

hpaulj 10.04.2023 18:26

Почему вы беспокоитесь об этом? Важно знать, когда операция возвращает новый массив, а не модифицирует существующий. Тесно связано это, зная, когда результат view против copy. Но попытка «перезаписать» для экономии времени или памяти — это сложная тема. Также операции могут создавать временные массивы, которые позже удаляются, когда все присваивание выполняется.

hpaulj 10.04.2023 18:39

@hpaulj В этом случае я пытаюсь убедиться, что массив не сохраняется за пределами определенной точки программы, где-либо на машине. Я не хочу, чтобы фрагменты данных оставались где-либо на оборудовании.

wb1210 10.04.2023 22:55

Для меня это не имеет смысла, но тогда я не эксперт в том, как numpy, python и ОС вместе управляют памятью. Это какая-то забота о «безопасности»?

hpaulj 10.04.2023 23:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

existing_array_name = numpy.zeros(...)

который не очищает память существующего массива. Он создает новый массив.

Если вы хотите обнулить элементы массива, используйте

array[...] = 0

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

numpy.add(a, b, out=c)

Спасибо за вашу помощь! Итак, если вы пытаетесь перезаписать массив numpy нулями, я мог бы использовать что-то вроде: numpy_array *= 0.0?

wb1210 10.04.2023 18:16

@ wb1210: Это не удается, если какие-либо элементы являются бесконечными или NaN. array[...] = 0 обрабатывает эти случаи, а также более прямо отображает намерение.

user2357112 10.04.2023 18:28

*=0 подход медленнее. Это примерно temp=arr*0.0; arr[:]=temp создание временного буфера.

hpaulj 10.04.2023 18:41

Другие вопросы по теме