gpt4 book ai didi

python - 在 Python 中使用 ctypes 访问数组

转载 作者:行者123 更新时间:2023-11-30 17:12:21 25 4
gpt4 key购买 nike

我正在用 C 语言编写一个 ode-solver,导出到 Windows DLL 和 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文件

# my_python.py
import ctypes
import numpy as np

class DATA(ctypes.Structure):
_fields_ = [
('nr_steps', ctypes.c_int),
('dt', ctypes.c_double),
('t', ctypes.POINTER(ctypes.c_double)),
('x', ctypes.POINTER(ctypes.c_double)),
('t0', ctypes.c_double),
('x0', ctypes.c_double)]

def __init__(self):
self.nr_steps = 1000
self.dt = 0.00001
self.t0 = 0.
self.x0 = 2./3
self.t = (ctypes.c_double * self.nr_steps)()
self.x = (ctypes.c_double * self.nr_steps)()

class SOLVER(object):
def __init__(self):
self.clib = ctypes.CDLL('rk4.dll')
self.clib.my_fun.argtypes = [ctypes.POINTER(DATA)]
self.clib.my_fun.restype = None

def func(self, data_struc):
self.clib.my_fun(ctypes.byref(data_struc))

solver = SOLVER()
data = DATA()
solver.func(data)

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

一切都运行良好,在最后一行之后 solver.func()时间数据和解数据存储在data.t中和data.x 。现在我需要从指针访问计算的数据。看来不能直接做。如果你这样做type(data.x)你得到<class '__main__.LP_c_double'> ,但是如果您尝试访问 type(data.x[i])你得到一个标准double .

每次我尝试例如 plot(data.t, data.x)或将其转换到 np.array(data.t) ,Python 文件崩溃并且 cmd 卡住。然而我认为x_python = [data.x[i] for x i in range(*number_of_elements*)]可以,但是如果数组很长,速度会很慢。

我的问题是:访问 C 解算器中计算的数据的正确/最佳方式是什么?

此外,如果这不是将数组从 C 传递到 Python 的最佳方式,那么还有哪些其他替代方法适合此类应用程序? IE。对于每个时间步长,或者可能在达到某个最终时间后,通过解决方案 (t, x) (元组或两个数组)从 C 到 Python?

最佳答案

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

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

因此,您可以迭代它们并创建数组。

此外,您可以将一个明确的 C 静态数组传递给 Python,而不是使用结构体,并使用 numpy 的 ctypes 支持来获取 numpy.ndarray,或使用 Python 的数组模块。

但是,我通过这个结构理解了你的观点。这些都是简单而干净的方法。

关于python - 在 Python 中使用 ctypes 访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31631470/

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