#python #numpy #reference
#python #numpy #ссылка
Вопрос:
У меня есть функция, которая при необходимости изменяет dtype входного массива:
def f(ar,dtype):
if ar.dtype!=dtype:
ar = ar.astype(dtype)
Это, однако, не работает, потому что я изменяю ссылку внутри функции, а внешняя область не знает об этом (насколько я понял).
Будет ли это наиболее эффективной версией:
def f(ar,dtype):
if ar.dtype!=dtype:
ar = ar.astype(dtype)
return ar
И я бы назвал это как ar=f(ar,np.float32)
. Вещь, в которой я не уверен, заключается в том, есть ли ненужные передачи памяти? Возвращает ли эта функция ссылку или копирует вновь созданный массив в область модуля?
Комментарии:
1. Вы создали новый массив в функции. Вы не изменили оригинал.
2. @hpaulj Я знаю об этом. Мой вопрос заключается в том, является ли этот способ принудительного применения типа данных с помощью вспомогательной функции оптимальным. В частности, когда я вызываю,
ar=f(ar,np.float32)
копируется ли массив, созданный внутри моей функцииar
, или он просто создается внутри функции, и ссылка передается оператором return?3.
ar=f(...)
присваивает переменной новый объект (не обязательно массив)ar
.ar[:] =...
Копирует значения только в существующий объект массива. Как правило, в Python присваивание и передача переменных в функции и из функций осуществляется по ссылке. Главное новоеnumpy
— это концепция aview
.4. Я бы посоветовал прочитать документы для
astype
, иnp.array
.ar = ar.astype(dtype, copy=False)
илиnp.array(ar, dtype=dtype, copy=False)
позволит вам пропуститьdtype
тест. Если это так, вам может даже понадобиться использовать дополнительную служебную функцию, подобную этой.5. Понятно, спасибо за ответ