python3调用c语言数组,使用Python中的ctypes访问数组
我正在用C编写一个ode解算器,导出到一个WindowsDLL和一个DLL的Python包装器。我非常习惯Python,但我对C和ctypes也是一个完全的初学者。在
受公认答案here启发的修改后的解决方案如下所示:
C代码/* my_clib.c */
#include
#include
#include
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.t和data.x。现在我需要从指针访问计算的数据。似乎不能直接做。如果你做type(data.x),你得到,但如果你试图访问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?在
python3调用c语言数组,使用Python中的ctypes访问数组相关推荐
- python中2d_【IT专家】如何在Python中复制一个2D数组?(复制)
本文由我司收集整编,推荐下载,如有疑问,请与我司联系 如何在 Python 中复制一个 2D 数组? ( 复制 ) 如何在 Python 中复制一个 2D 数组 ?( 复制 )[ 英 ]How to ...
- Python中利用numpy将数组(矩阵)存成csv文件,将csv文件读取为数组(矩阵)
Python中利用numpy将数组(矩阵)存成csv文件,将csv文件读取为数组(矩阵) 本博客转载自:https://blog.csdn.net/vernice/article/details/50 ...
- 创建二维数组 以及 python中[0 ]* n与[0 for _ in range(n)]的区别与联系
一.浅拷贝于深拷贝 关于浅拷贝于深拷贝:Python 的深拷贝和浅拷贝 直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy) ...
- python中的二维数组_Python中的二维数组实例(list与numpy.array)
关于python中的二维数组,主要有list和numpy.array两种. 好吧,其实还有matrices,但它必须是2维的,而numpy arrays (ndarrays) 可以是多维的. 我们主要 ...
- python中的二维数组与一维数组,矩阵和一维数组之间的运算
一.python中的二维数组和一维数组之间的运算 1.当二维数组为p×p维 a=np.array([[1,2],[3,4]]) print(a.shape) a 输出: (2, 2) array([[ ...
- python 数组 动态赋值_动态数组在Python中的实现
动态数组 在python中,列表,集合和字典是可变对象.数字,字符串和元组是不可变的对象.可变对象意味着我们从列表,集合或字典中添加/删除项目,但是对于不可变对象(例如元组或字符串)而言,情况并非如此 ...
- python中序列类型和数组之间的区别_「Python」序列构成的数组
一.Python 标准库的序列类型分为: 容器序列: 能够存放不同类型数据的序列(list.tuple.collections.deque). 扁平序列: 只能容纳一种类型的数据(str.bytes. ...
- python创建长度为n的数组_在Python中建立N维数组并赋初值
在Python中,由于不像C++/Java这样的语言可以方便的用a[i][j]=0的方式,建立二维数组并赋初值,所以需要一个相对巧妙的方法. 可以用列表解析的方式,eg: >>> m ...
- python定义二维数组_在python中定义二维数组
原博文 2016-08-30 19:16 − 发表于 http://liamchzh.0fees.net/?p=234&i=1 一次偶然的机会,发现python中list非常有意思. 先看一段 ...
最新文章
- 应届硕士研究生算法岗秋招总结
- java消费者中url找不到,java – URL可以使用浏览器访问,但是仍然是具有URLConnection的FileNotFoundException...
- vc/vs开发的应用程序添加dump崩溃日志转
- selenium 鼠标悬浮_处理Selenium3+python3定位鼠标悬停才显示的元素
- 如何解决秒杀的性能问题和超卖的讨论
- ERROR ITMS-90206:Invalid Bundle. The bundle at ‘xx.app/xx/xx.framework' contan
- php列表代码怎么做的,php项目实战:代码讲解之订单列表问题
- 数据恢复的学习旅程开始
- 计算机组成原理实验基本运算器,计算机组成原理运算器实验-20210611075033.docx-原创力文档...
- 二叉树的遍历方法总结与c++实现
- HSV空间改进的多尺度Retinex算法
- RDPWrap远程桌面的一次脱坑
- restsharp text html,c# – 使用RestSharp发送HTTP POST Multipart / form-data字段
- 【Pygame闯关游戏】手残勿入,最新虐心游戏《见缝插针》——不得不玩的一款游戏。
- Adobe pr,ae,ps...软件的安装,及简单的使用
- VS如何安装到电脑上
- 信道、频段带宽等术语简介
- 什么是pisa测试_PISA测试很专业,但对理解什么是教育很重要
- 数据挖掘项目之Airbnb 新用户的民宿预定结果预测
- 为什么Y电容容量基本都不大于0.1uF?