Изменение типа массива при необходимости внутри функции проверки

#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 — это концепция a view .

4. Я бы посоветовал прочитать документы для astype , и np.array . ar = ar.astype(dtype, copy=False) или np.array(ar, dtype=dtype, copy=False) позволит вам пропустить dtype тест. Если это так, вам может даже понадобиться использовать дополнительную служебную функцию, подобную этой.

5. Понятно, спасибо за ответ