gpt4 book ai didi

python - 将 swig python 'double *' 对象读入 numpy(也许通过 ctypes?)

转载 作者:行者123 更新时间:2023-11-28 21:35:53 25 4
gpt4 key购买 nike

我有无法修改的 swig python 库。

它返回一个 <Swig object of type 'double *'>我知道这是一个指向 double 组的指针。通过一个单独的函数,我得到了一个 python int 的长度。

我的问题是,如何将这些数据读入 numpy?

我找到了 numpy.ndarray.ctypes 模块,还有另一个 stackoverflow 答案暗示从 SWIG 到 ctypes 的转换是可能的 (https://stackoverflow.com/a/41212424/654602),但没有提及如何转换。

感谢任何帮助。

最佳答案

我创建了一个示例 SWIG 包装器来测试它:

%module test

%{
#include <stdlib.h>
#include <stdio.h>

double* get(void)
{
double* p = malloc(sizeof(double) * 10);
for(int i = 0; i < 10; ++i)
p[i] = 1.1 * i;
printf("%p\n",p);
return p;
}
%}

double* get(void);

以下通过 ctypes 检索数据:

>>> import test
>>> a = test.get()
000001A3D05ED890 # From the printf...
>>> a
<Swig Object of type 'double *' at 0x000001A3D27D6030>
>>> hex(int(a))
'0x1a3d05ed890' # int() of the object is the same address
>>> from ctypes import *
>>> p = (c_double * 10).from_address(int(a))
>>> list(p)
[0.0, 1.1, 2.2, 3.3000000000000003, 4.4, 5.5, 6.6000000000000005, 7.700000000000001, 8.8, 9.9]

现在是 numpy。可能有更好的方法,但我找到了 __array_interface__ ( link )。 “类数组”对象具有此接口(interface),可以从中创建另一个数组:

>>> class Tmp: pass
...
>>> Tmp.__array_interface__ = {'shape':(10,),'typestr':'<f8','data':(int(a),False),'version':3}
>>> import numpy as np
>>> np.array(Tmp,copy=False) # Create array that shares the same interface
array([0. , 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9])

也许不是最好的方法,但我不是 numpy 的重度用户。

关于python - 将 swig python 'double *' 对象读入 numpy(也许通过 ctypes?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51776809/

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