一个 numpy 数组,把它传给一个函数 fun 搞点操作,涉及改变数组中的值,这些改变会否影响原数组?本文对比两种写法,效果不同,根源是 python 的变量名相当于 C 的指针。python 自带的 list、pytorch.tensor 也可参考。
本文也简单用到 numba,作为简例。
Code
numba.jit函数签名当没有返回值时,可写void。
import numpy as np
import numba as nb
@nb.jit('void(i4[:])')
def fun1(arr):
arr[2] = - arr[2] # change successfully
arr = - arr # change WON'T last
@nb.jit('void(i4[:])')
def fun2(arr):
arr[2] = - arr[2] # change successfully
arr[:] = - arr # change successfully, too
print("fun1")
x = np.arange(7)
print(x, x.dtype)
fun1(x)
print(x)
print("fun2")
y = np.arange(7)
print(y)
fun2(y)
print(y)
输出:
fun1
[0 1 2 3 4 5 6] int32
[ 0 1 -2 3 4 5 6]
fun2
[0 1 2 3 4 5 6]
[ 0 -1 2 -3 -4 -5 -6]
可见,fun1、fun2 的第一句修改都影响了原数组 x、y;但 fun1 的第二句只改了 fun1 内部 arr 的指向,而不影响其原数组 x,而 fun2 的第二句加了 [:],则同第一句一样,能影响原数组 y。
文章比较了在Python中使用numpy数组时,两个函数对数组进行修改的不同行为。函数fun1中的局部变量修改不影响原数组,而fun2中通过切片操作则会。同时提及了Numba的jit函数签名及其在不返回值时的使用情况。
1104

被折叠的 条评论
为什么被折叠?



