Adding to Tark-Tolonen's answer:
Please absolutely avoid altering the object reference of the output argument in your function, otherwise the output argument won't work. For instance, I wish to pass an ndarray into a function my_fun
and modify it
def my_fun(out_arr)
out_arr = np.ones_like(out_arr)
print(out_arr) # prints 1, 1, 1, ......
print(id(out_arr))
a = np.zeros(100)
my_fun(a)
print(a) # prints 0, 0, 0, ....
print(id(a))
After calling my_fun
, array a
stills remains all zeros since the function np.ones_like
returns a reference to another array full of ones and assigns it to out_arr
instead of modifying the object reference passed by out_arr
directly. Running this code you will find that two print(id())
gives different memory locations.
Also, beware of the array operators from numpy, they usually returns a reference to another array if you write something like this
def my_fun(arr_a, arr_b, out_arr)
out_arr = arr_a - arr_b
Using the -
and =
operator might cause similar problems. To prevent having out_arr
's memory location altered, you can use the numpy functions that does the exactly same operations but has a out
parameter built in. The proceeding code should be rewritten as
def my_fun(arr_a, arr_b, out_arr):
np.subtract(arr_a, arr_b, out = out_arr)
And the memory location of out_arr
remains the same before and after calling my_fun
while its values gets modified successfully.