Python 如何将数组指针传递给函数?

Python 如何将数组指针传递给函数?,python,arrays,numpy,numba,Python,Arrays,Numpy,Numba,我想创建一个Numba编译函数,它将数组的指针或内存地址作为参数,并对其进行计算,例如修改底层数据 用于说明这一点的纯python版本如下所示: 导入ctypes 进口麻木为nb 将numpy作为np导入 arr=np.arange5.astypenp.double创建任意numpy数组 def修改_数据地址: 获取数组的内存地址以对其进行修改的函数 ptr=ctypes.c\u void\u paddr 数据=nb.carrayptr,arr.shape,dtype=arr.dtype 数据+

我想创建一个Numba编译函数,它将数组的指针或内存地址作为参数,并对其进行计算,例如修改底层数据

用于说明这一点的纯python版本如下所示:

导入ctypes 进口麻木为nb 将numpy作为np导入 arr=np.arange5.astypenp.double创建任意numpy数组 def修改_数据地址: 获取数组的内存地址以对其进行修改的函数 ptr=ctypes.c\u void\u paddr 数据=nb.carrayptr,arr.shape,dtype=arr.dtype 数据+=2 addr=arr.ctypes.data 修改数据地址 啊 >>>数组[2,3,4,5,6] 正如您在示例中所看到的,数组arr没有显式地传递给函数就被修改了。在我的用例中,数组的形状和数据类型是已知的,并且将始终保持不变,这将简化接口

1.尝试:天真的jitting 我现在尝试编译modify_data函数,但失败了。我的第一次尝试是使用

形状=arr.shape dtype=arr.dtype @nb.njit def modify_data_nbptr: 数据=nb.carrayptr,形状,数据类型=数据类型 数据+=2 ptr=ctypes.c\u void\u paddr 修改数据\u nbptr>数组[0,1,2] 创建使用指针的函数 形状=arr.shape dtype=arr.dtype @nb.cfuncnb.types.voidnb.types.CPointernb.types.double def modify_dataptr: 数据=nb.carrayptr,形状,数据类型=数据类型 数据+=2 modify_data_llc=低级别可调用修改_data.ctypes.function 创建指向数组的指针 ptr=arr.ctypes.data\u asctypes.POINTERctypes.c\u double 仅使用指针调用函数 修改数据 检查数组是否被修改 印塔 >>>数组[2,3,4]
我现在可以调用一个函数来访问数组,但是这个函数不再是Numba函数。特别是,它不能用于其他NUBA函数。

多亏了伟大的@stuartarchibald,我现在有了一个可行的解决方案:

导入ctypes 进口麻木为nb 将numpy作为np导入 arr=np.arange5.astypenp.double创建任意numpy数组 印塔 @注:内在的 def地址作为无效指针键入CTX,src: 从给定内存地址返回空指针 从numba.core导入类型,cgutils sig=types.voidptrsrc def代码GENCGCTX、生成器、信号、参数: 返回生成器.inttoptrargs[0],cgutils.voidptr\t 返回信号 addr=arr.ctypes.data @nb.njit def修改_数据: 获取数组的内存地址以对其进行修改的函数 data=nb.carrayaddress\u as\u void\u pointeraddr,arr.shape,dtype=arr.dtype 数据+=2 修改数据 印塔
关键是新的address\u as\u void\u pointer函数,它将作为int给出的内存地址转换为numba.carray可以使用的指针。

多亏了伟大的@stuartarchibald,我现在有了一个可行的解决方案:

导入ctypes 进口麻木为nb 将numpy作为np导入 arr=np.arange5.astypenp.double创建任意numpy数组 印塔 @注:内在的 def地址作为无效指针键入CTX,src: 从给定内存地址返回空指针 从numba.core导入类型,cgutils sig=types.voidptrsrc def代码GENCGCTX、生成器、信号、参数: 返回生成器.inttoptrargs[0],cgutils.voidptr\t 返回信号 addr=arr.ctypes.data @nb.njit def修改_数据: 获取数组的内存地址以对其进行修改的函数 data=nb.carrayaddress\u as\u void\u pointeraddr,arr.shape,dtype=arr.dtype 数据+=2 修改数据 印塔
关键是新的address\u as\u void\u指针函数,它将作为int给出的内存地址转换为numba.carray可以使用的指针。

我不知道如何从解释代码调用此函数,但从另一个jitted函数调用它是可行的。@nb.njit def callarr:modify_data_nbarr.cTypes这是一个有趣的观察结果,但不幸的是它对我没有帮助,因为我认为它不会在函数调用范围之外更改arr的内容。我不知道如何从解释的代码调用此函数,但它可以从另一个jitted函数调用。@nb.njit def callarr:modify_data_nbarr.cTypes这是一个有趣的观察结果,但不幸的是,它对我没有帮助,因为我认为它不会在函数调用范围之外更改arr的内容。