使用Python中的ctypes访问数组

2024-05-19 19:18:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用C编写一个ode解算器,导出到一个WindowsDLL和一个DLL的Python包装器。我非常习惯Python,但我对C和ctypes也是一个完全的初学者。在

受公认答案here启发的修改后的解决方案如下所示:

C代码

/* my_clib.c */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct data {
  int nr_steps;
  double dt;
  double* t;
  double* x;
  double t0, x0;
 };

double fun_to_integrate(double t, double y){
    return (y - t);
 }

double rk4(double t, double y, double dt){
    double  k1 = dt * fun_to_integrate(t, y),
            k2 = dt * fun_to_integrate(t + dt / 2, y + k1 / 2),
            k3 = dt * fun_to_integrate(t + dt / 2, y + k2 / 2),
            k4 = dt * fun_to_integrate(t + dt, y + k3);
    return y + (k1 + 2 * k2 + 2 * k3 + k4) / 6;
}

__declspec(dllexport) void my_fun(struct data* pointer){
    int i;
    double dt;
    dt = pointer->dt;
    pointer->t[0] = pointer->t0;
    pointer->x[0] = pointer->x0;
    for(i = 1; i < pointer->nr_steps; i++){
        pointer->t[i] = dt*i + pointer->t0;
        pointer->x[i] = rk4(pointer->t[i-1], pointer->x[i-1], dt);
    }
 }

使用相应的Python文件

^{pr2}$

在Windows 8上使用MinGW用gcc -o -c my_clib.o my_clib.c+gcc -o rk4.dll -shared my_clib.o编译。在

一切运行良好,在最后一行solver.func()之后,时间数据和解决方案数据存储在data.tdata.x。现在我需要从指针访问计算的数据。似乎不能直接做。如果你做type(data.x),你得到<class '__main__.LP_c_double'>,但如果你试图访问type(data.x[i]),你会得到一个标准double。在

{cmd}每一次,{cds}都会使文件崩溃。不过,我认为x_python = [data.x[i] for x i in range(*number_of_elements*)]可以工作,但是如果数组很长,则速度非常慢。在

我的问题是:访问C-solver计算的数据的正确/最佳方式是什么?在

另外,如果这不是将数组从C传递到Python的最佳方法,那么还有什么其他方法适合这种应用程序?一、 对于每一个时间步,或者可能在到达最后一个时间之后,将解决方案(t, x)(元组或两个数组)从C传递到Python?在


Tags: to数据dataincludemydtclibk1
2条回答

您可以使用^{}。在

Create a numpy array from a ctypes array or a ctypes POINTER. The numpy array shares the memory with the ctypes object.

numpy.ctypeslib.as_array(data.x, (data.nr_steps,)

只有一点issue使用不同形状的同一指针。在

要从作用于int、long等的ctypes对象访问值,请使用:

x = ctypes.c_int(123)
print x.value

所以,您可以迭代它们并生成数组。在

另外,您可以将一个清晰的C静态数组传递给Python而不是使用结构,并使用numpy的cypes支持来获得努比·恩达雷,或使用Python的数组模块。在

但是,我用这个结构明白你的意思。这些都是简单明了的方法。在

相关问题 更多 >