Я ищу подтверждение того, что перезапись массива numpy с помощью numpy.zeros
перезаписывает массив в местах в памяти, где хранятся элементы исходного массива.
Документация обсуждает это, но, похоже, у меня недостаточно знаний, чтобы понять, перезапишет ли местоположение на месте просто установка новых значений с помощью функции нулей. Один вопрос, заданный здесь , по-видимому, указывает на то, что да. С другой стороны, если я правильно интерпретирую ответ на этот вопрос, может и не быть.
Ваша первая ссылка, «документация», предназначена для пользователей C-API, а вторая — для cython
, поэтому они имеют для вас ограниченное значение. Весь мой ответ в последней ссылке говорит вам, как определить, «где» хранятся данные. Ни один из них не говорит вам, какие операции изменяют существующие данные, а не возвращают новый массив.
Почему вы беспокоитесь об этом? Важно знать, когда операция возвращает новый массив, а не модифицирует существующий. Тесно связано это, зная, когда результат view
против copy
. Но попытка «перезаписать» для экономии времени или памяти — это сложная тема. Также операции могут создавать временные массивы, которые позже удаляются, когда все присваивание выполняется.
@hpaulj В этом случае я пытаюсь убедиться, что массив не сохраняется за пределами определенной точки программы, где-либо на машине. Я не хочу, чтобы фрагменты данных оставались где-либо на оборудовании.
Для меня это не имеет смысла, но тогда я не эксперт в том, как numpy
, python
и ОС вместе управляют памятью. Это какая-то забота о «безопасности»?
Невозможно перезаписать память существующего массива 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: Это не удается, если какие-либо элементы являются бесконечными или NaN. array[...] = 0
обрабатывает эти случаи, а также более прямо отображает намерение.
*=0
подход медленнее. Это примерно temp=arr*0.0; arr[:]=temp
создание временного буфера.
Большинство функций numpy возвращают новый объект массива, например нули(). Если вы хотите перезаписать элементы существующего массива, вам нужно сделать это с помощью прямого присваивания (например, array[:] = 0).