копия массива перезаписывается в функции - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь создать массив np.zeros((3, 3)) вне функции и снова и снова использовать его внутри функции. Причина этого - реализация numba's cuda, которая не поддерживает array creation внутренних функций, которые должны выполняться на gpu. Итак, я создаю вышеупомянутый массив ar_ref и передаю его в качестве аргумента function. ar создает копию ar_ref (предполагается, что это будет использоваться как «fre sh» np.zeros((3, 3)) copy). Затем я вношу некоторые изменения в ar и возвращаю его. Но в процессе ar_ref перезаписывается внутри функции последней итерацией ar. Как мне начинать каждую новую итерацию функции с ar = np.zeros((3, 3)) без необходимости вызывать np.zeros внутри function?

import numpy as np

def function(ar_ref=None):
    for n in range(3):
        print(n)
        ar = ar_ref
        print(ar)
        for i in range(3):
            ar[i] = 1
        print(ar)
    return ar

ar_ref = np.zeros((3, 3))
function(ar_ref=ar_ref)

Вывод:

0
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
1
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
2
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

1 Ответ

2 голосов
/ 10 июля 2020

простое присваивание будет назначать только указатель, поэтому при изменении ar, ar_ref тоже изменяется. попробуйте использовать мелкую копию для этой проблемы

import numpy as np
import copy 

def function(ar_ref=None):
    for n in range(3):
        print(n)
        ar = copy.copy(ar_ref)
        print(ar)
        for i in range(3):
            ar[i] = 1
        print(ar)
    return ar

ar_ref = np.zeros((3, 3))
function(ar_ref=ar_ref)

вывод:

0
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
1
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
2
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...