gpt4 book ai didi

python - 使用 SWIG 的模块级 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-03 19:07:51 24 4
gpt4 key购买 nike

我正在为我编写的科学 C 库创建一个 python 包装器。该库包含在编译时全局定义的 double 常量数组,即

const double arr[NARR] = { 200.0, 201.0, ... 899.0, 900.0 };

我想使用 SWIG 使其成为我的 python 模块中的模块级 numpy 数组,即

>>> import foo
>>> foo.arr
array([200.0, 201.0, ..., 889.9, 900.0])

我似乎无法在文档中找到任何使用常量数组来执行此操作的内容。一切似乎都涉及从函数返回 numpy 数组,或定义非数组常量。

我知道如何通过手动包装数组来做到这一点:

npy_intp dim[1] = { NARR };
PyObject *a = PyArray_SimpleNewFromData(1, dim, NPY_DOUBLE, arr);
PyObject_SetAttrString(module, "arr", a);

我只是无法让它与 SWIG 一起工作。当我尝试将上述代码放入 foo.i 文件的 init block 中时,“arr”变量不会显示在 foo 模块中。

有人能告诉我如何让它正常工作吗?

编辑

根据 seberg 的建议更改了手动包装数组的代码示例。

最佳答案

我已经找到了这个问题的解决方案,但它非常hackish。

我在 foo.i 文件中包含了两个代码扩展,一个是 C 语言,另一个是 Python 语言。 C 扩展创建一个返回 C 数组的函数,以及一条告诉 SWIG 创建一个包装器的语句,该包装器将此 C 数组作为 numpy 数组返回:

/* Tell SWIG I want the function to output a numpy array */
%apply double ARGOUT_ARRAY1[ANY] { double a[NARR] };
/* Create a function that returns a copy of the array */
%inline %{
void _get_arr(double a[NARR]) {
for (int i = 0; i < NARR; i++)
a[i] = arr[i];
}
%}

Python 扩展调用此函数并将其放入模块级 numpy 数组变量 arr (为了更好的测量,我将其设置为只读):

%pythoncode %{
# Make the arr array a read-only module-level numpy array
arr = _get_arr()
arr.flags.writeable = False
%}

因为我要将其作为分发,所以我可以控制 __init__.py 文件中导入的函数,因此 _get_arr 不会与 foo 一起导入。

我现在得到了想要的结果:

>>> import foo
>>> foo.arr
array([200.0, 201.0, ..., 889.9, 900.0])
>>> foo.arr[0] = 10
RuntimeError: array is not writeable
>>> foo._get_arr()
AttributeError: 'module' object has no attribute '_get_arr'

关于python - 使用 SWIG 的模块级 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14135946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com