首页 > 其他分享 >Cython将Numpy数组转为自定义结构体

Cython将Numpy数组转为自定义结构体

时间:2024-08-07 09:42:03浏览次数:16  
标签:Cython 自定义 Python C语言 crd np trans Numpy

技术背景

前面我们写过几篇关于Cython的文章,例如Cython计算谐振势Cython与C语言的结合Cython调用CUDA Kernel函数。Cython有着非常Pythonic的编程范式,又具备着接近于C语言的性能,因此在很多对于性能有要求的Python软件中都会使用到Cython的性能优化。Cython的基本工作流程是,先将*.pyx文件转换为*.c的C语言代码,然后再使用gcc编译成一个*.so动态链接库文件,供Python或者其他语言的代码调用。

这里我们考虑一个较为特殊的场景:将Python端常用的Numpy数组,转换为C语言的结构体,然后执行相应的任务或者计算。

Cython结构体

在Cython中可以使用ctypedef struct来定义一个可以跟C语言通用的结构体,例如,我们可以定义一个原子坐标的结构体:

ctypedef struct CRD:
    double x, y, z

这是一个三维空间中的原子坐标,在Python中就相当于一个shape为(3,)的数组。如果这是C++,那我们可以通过dynamic_cast等转换方式在数组和结构体之间进行转换。而C语言和Cython则是直接通过变量类型来进行转换,以下是一个完整的Cython示例:

ctypedef struct CRD:
    double x, y, z

cpdef int trans(double[:] crd):
    cdef:
        CRD* crd_s = <CRD*>&crd[0]
    print (crd_s.y)
    return 1

在这个示例中,我们输入给函数trans()的是一个shape为(3,)的数组,然后在cdef中将这个原子坐标转换为结构体的形式,最后在Cython中打印输出该原子的y坐标。我们用Cython编译这个文件之后,可以在Python中调用:

In [1]: from trans import trans

In [2]: import numpy as np

In [3]: a = np.array([1,2,3], dtype=np.float64)

In [4]: trans(a)
2.0
Out[4]: 1

需要注意的是,这种转换方式并不安全,这里我们仅仅演示一下这种转换方式的使用方法。

多原子坐标结构体

其实从C语言的角度还蛮好理解的,我们通过单个结构体可以定义一个原子的空间坐标,那么用一个指针,就可以定义多个原子的空间坐标。这里我们定义多原子坐标的结构体为:

ctypedef struct PATH:
    CRD crds

其实这里还是表示一个单原子的空间坐标,但是从一维指向变成了二维指向,此时我们可以通过PATH来构造一个多原子坐标的指针:

ctypedef struct CRD:
    double x, y, z

ctypedef struct PATH:
    CRD crds

cpdef int trans(double[:] crd, double[:, :] path):
    cdef:
        int atoms = path.shape[0]
        int i
        CRD* crd_s = <CRD*>&crd[0]
        PATH* path_s = <PATH*>&path[0][0]
    print (crd_s.y)
    for i in range(atoms):
        print (path_s[i].crds.x, path_s[i].crds.y, path_s[i].crds.z)
    return 1

同样的,我们可以在Cython编译之后,通过Python来调用这个trans函数:

from trans import trans
import numpy as np

a = np.array([1,2,3], dtype=np.float64)
b = np.arange(12).reshape((4,3)).astype(np.float64)

print (trans(a, b))

输出结果为:

2.0
0.0 1.0 2.0
3.0 4.0 5.0
6.0 7.0 8.0
9.0 10.0 11.0
1

当然,这里还是需要提醒一下,这种指针转换的方式并不安全,需要谨慎使用。

总结概要

这篇文章介绍了在Cython中定义结构体,并在Python的Numpy数组/MemoryView和自定义结构体之间进行数据转换的方法。Cython有着非常Pythonic的编程范式,又具有接近于C语言的性能,对于Python开发者而言确实是一个很棒的工具。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/cython-struct.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

标签:Cython,自定义,Python,C语言,crd,np,trans,Numpy
From: https://www.cnblogs.com/dechinphy/p/18346364/cython-struct

相关文章

  • 从多个方面了解工作流自定义表单的优势
    进入流程化办公新时代,需要借助低代码技术平台、工作流自定义表单的诸多优势特点,打破信息孤岛,做好各部门之间的沟通协调工作,实现高效率发展。很多大中型企业都想了解工作流自定义表单究竟有什么样的优势和特点,现在,我们通过分析它的优势和特点,来进一步深入了解工作流自定义表单吧。......
  • 数据同步的艺术:在SQL Server中打造自定义同步引擎
    数据同步的艺术:在SQLServer中打造自定义同步引擎在企业级应用中,数据同步是确保数据一致性的关键技术。SQLServer提供了多种数据同步机制,包括事务复制、合并复制和数据仓库等。然而,在特定场景下,我们可能需要实现更灵活的自定义数据同步机制。本文将深入探讨如何在SQLServ......
  • 【NumPy 入门:常用函数与方法总结】
    文章目录前言1、np.array()函数2、np.arange函数(用于生成数值序列的函数)3、np.linspace函数(用于生成数值序列的函数)4、ndarray.dtype和ndarray.dtype.name属性5、矩阵乘积6、ravel方法、T和flat属性7、np.vstack和np.hstack函数8、column_stack函数9、np.r_和......
  • 帝国CMS自定义页面动态设置
    帝国CMS提供灵活的自定义页面功能,允许用户创建和管理动态内容页面。以下步骤介绍如何设置帝国CMS自定义页面动态:1.创建自定义页面在帝国CMS管理后台,导航到"栏目">>"自定义页面">>"添加自定义页面"。输入页面标题和页面内容,然后单击"提交"保存页面。2.定义字段转到"栏目">>"......
  • 记一次 Android 自定义相机拍照奔溃bug事件
    最近在开发一个美颜的相机功能,需要自定义抓取相机回调的数,生成照片并保存到相册,需要自定义保存照片。相机开始使用时没有任何问题,测试拍照几次后突然奔溃,跟踪代码日志发现是图片保存失败,同样的代码,同样的逻辑,正常使用很多次以后才奔溃报错,根据日志找到报错的位置,ContentValue......
  • 织梦dedecms调用文章列表时候判断文章自定义属性
    有时候我们需要通过判断文章的属性来给相应的属性以相应的样式,例如为推荐的文章添加推荐的标志等等。例如以下代码就可以判断出文章是否是推荐和图片这两个属性,并作不同的样式输出:[field:arrayrunphp=&#39;yes&#39;]if(@me[&#39;flag&#39;]==&#39;c,p&#39;)@me=&#39;<em>......
  • wordpress教程栏目给大家介绍自定义wordpress文件上传路径的方法
    自WordPress3.5版本开始,隐藏了后台媒体设置页面的“默认上传路径和文件的完整URL地址”选项,可以通过下面的代码将该选项调出来。将下面的代码添加到当前主题functions.php文件中,就可以调出该选项:if(get_option(&#39;upload_path&#39;)==&#39;wp-content/uploads&#39;||get_op......
  • 在 jupyter Notebook 中导入自定义模块的问题
    假设我们有一个如下的文件结构,#注意:不是实际的目录结构,而是类似的root../tests../src../__init__.pyutils../__init__.pydata.pypipeline.pysqlal../__init__.pysql_alchm.pytest.pyprocess.ipynb......
  • 如何在 ARM64 上的 Windows 上安装 SciPy 和 Numpy
    我需要numpy和scipy来执行一些信号分析。有人成功做到这一点吗?(我有兴趣在本机运行它,而不是通过virtualenv)。我的最终目标是从使用numpy和scipy的python脚本构建一个exe,可以在WinPE中运行进行测试。我已经成功安装了python3.11.2,并且能够进行numpy安装,但它......
  • 呆滞料分析报表二开增加自定义字段
     业务背景物料资料添加了自定义字段,在呆滞料分析无法直观看到,同时不能直观看到物料在仓库多久了。 业务需求在呆滞料分析报表显示物料的品牌型号,以及计算物料库龄。 方案设计二开标准产品,添加字段,创建插件继承标准产品插件,重写方法,自定义临时表获取初步查询......