Arrays 无法修改作为带有循环的参数传递的1d numpy数组

Arrays 无法修改作为带有循环的参数传递的1d numpy数组,arrays,numpy,loops,numba,Arrays,Numpy,Loops,Numba,我对一个numba循环和一个1d numpy数组感到头痛,我似乎找不到解释。 基本上,我的目标是使用作为参数传递的函数来并行修改numpy数组和numba循环。它适用于2d numpy阵列,但由于某些原因,它不适用于简单的1d numpy阵列。这是重现问题的代码: import numpy as np import numba as nb size = 10 # Define a 1d numpy array vec_test_1 = np.zeros(size) # Fill the

我对一个numba循环和一个1d numpy数组感到头痛,我似乎找不到解释。 基本上,我的目标是使用作为参数传递的函数来并行修改numpy数组和numba循环。它适用于2d numpy阵列,但由于某些原因,它不适用于简单的1d numpy阵列。这是重现问题的代码:

import numpy as np
import numba as nb

size = 10


# Define a 1d numpy array
vec_test_1 = np.zeros(size)

# Fill the 1d array with values
for i in range(size):
    vec_test_1[i] = float(i)


# Function that modifies and element
@nb.jit(nopython = True)
def func1(xyz):
    xyz = xyz + 2.47


# Loop with numba to modify all elements of the array
@nb.jit(nopython = True, parallel = True)
def loop_numba(vec, func):
    for i in nb.prange(len(vec)):
        func(vec[i])



loop_numba(vec_test_1, func1)
此循环后,vec_测试_1保持不变:

array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
何时应该:

array([ 2.47,  3.47,  4.47,  5.47,  6.47,  7.47,  8.47,  9.47, 10.47,
   11.47])
让我惊讶的是,当作为参数传递的数组是2d数组时,它工作得很好。我可以用numba循环修改它的所有元素


有人能帮我理解这个问题吗?

你必须定义一个返回值,因为你在传递给函数时复制了单个元素

说明:找到了

基本上:您将一个不可变的元素传递给函数,因此它是通过copy传递的(创建了一个副本,该副本在函数中更改)。如果您使用2D数组执行此操作,那么对于python来说,这是一个可变的对象,因此它是通过引用传递的。如果现在对其进行操作,则基础引用将发生更改,并且这在函数外部的结果中可见

将numpy导入为np
进口麻木为nb
尺寸=10
#定义一维numpy数组
向量测试1=np.arange(大小,数据类型=np.float32)
#修改元素的函数
@注意:jit(nopython=True)
def func1(xyz):
xyz=xyz+2.47
返回xyz
#使用numba循环以修改数组的所有元素
@注意:jit(nopython=True,parallel=True)
def循环编号(vec,func):
对于我在nb.prange(len(vec)):
向量[i]=func(向量[i])
循环编号(向量测试1,函数1)
在[2]中:vec_test_1
出[2]:
数组([2.47,3.47,4.47,5.47,6.47,7.47,8.47,9.47,10.47,
11.47],数据类型=32)


另外:我将向量初始化更改为
np.arange(size,dtype=float)
以便于理解。

非常感谢@Dorian!现在它起作用了。我明白原因。然而,我必须承认,2D数组的元素被认为是可变的,而一维数组的元素被认为是不可变的,这对我来说很奇怪。一个一维数组的元素是一个整数/FLASH,这是不可变的。自从我在C++中学习编程以来,我不得不与它进行大量的斗争,但是,有时候它很奇怪。