北京 | 深度学习与人工智能研修
12月23-24日

再设经典课程 重温深度学习
阅读全文
>

正文共2583个字,7张图,预计阅读时间:7分钟。

前言

整个快速教程直接上例子,具体对Cython的使用可以看参考文章。以下工作均在Windows 10 + Python 2.7 + NumPy 1.11.0 + Cython 0.24 版本上进行。

正文

准备工作

假设现在我们用C实现了一个可以用在数组上的cos函数,函数原型如下:

// 对in_array中的前size个数求cos值,并存放在out_array对应位置上

void cos_doubles(double * in_array, double * out_array, int size);

那么总共需要4个文件:

cos_doubles.c,C源文件。

cos_doubles.h,C头文件。

_cos_doubles.pyx,Python的C扩展文件。(注意:之所以前面加个"_"下划线,是因为使用Cython编译打包后会对pyx文件生成同名的c文件,为了避免覆盖掉原来的cos_doubles.c文件,此处加个下划线)

setup.py,负责管理编译、打包工作的“配置”脚本。

下面给出4个文件的源代码:

cos_doubles.c

#include "cos_doubles.h"

#include <math.h>

/*  Compute the cosine of each element in in_array, storing the result in

*  out_array. */

void cos_doubles(double * in_array, double * out_array, int size){

int i;

for(i=0;i<size;i++){

out_array[i] = cos(in_array[i]);

}

}

cos_doubles.h

#ifndef _COS_DOUBLES_H

#define _COS_DOUBLES_H

void cos_doubles(double * in_array, double * out_array, int size);

#endif

cos_doubles.pyx

""" Example of wrapping a C function that takes C double arrays as input using

the Numpy declarations from Cython """

# import both numpy and the Cython declarations for numpy

import numpy as np

cimport numpy as np

# if you want to use the Numpy-C-API from Cython

# (not strictly necessary for this example)

np.import_array()

# cdefine the signature of our c function

cdef extern from "cos_doubles.h":

void cos_doubles (double * in_array, double * out_array, int size)

# create the wrapper code, with numpy type annotations

def cos_doubles_func(np.ndarray[double, ndim=1, mode="c"] in_array not None,

np.ndarray[double, ndim=1, mode="c"] out_array not None):

cos_doubles(<double*> np.PyArray_DATA(in_array),

<double*> np.PyArray_DATA(out_array),

in_array.shape[0])

setup.py

from distutils.core import setup, Extensionimport numpyfrom Cython.Distutils import build_ext

setup(

cmdclass={'build_ext': build_ext},

ext_modules=[Extension("cos_doubles",

sources=["_cos_doubles.pyx", "cos_doubles.c"],

include_dirs=[numpy.get_include()])],

)

编译打包

在命令行窗口中进入到上述文件所在同级目录,输入:

>> python setup.py build_ext -i

参数-i表示inplace,即在同级目录下生成Python可调用模块pyd文件。

build过程如下:

build过程

然后可以看见在同级目录下多了两个文件:

_cos_doubles.c,使用Python C-API自动包装生成的C文件。

cos_doubles.pyx,Python可直接调用的module文件,也就是最终我们所需要的东西。

接下来测试一下:

# file: test.py

import cos_doubles

import numpy as np

import matplotlib.pyplot as plt

a = np.linspace(-5, 5, 100)

b = np.empty_like(a)

cos_doubles.cos_doubles_func(a, b)

plt.plot(b)

plt.show

()

运行效果如下图所示:

运行效果

参考资料

[1] SciPy lecture notes: 2.8. Interfacing with C

[2] Working with NumPy

[3] Python中使用C代码:以NumPy为例

[4] Cython学习

原文链接:http://www.jianshu.com/p/1918e580581d

查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org

请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看


LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础


点击“阅读原文”直接打开报名链接

快速教程:使用Cython来扩展Python/NumPy库相关推荐

  1. python numpy库安装-Python Numpy库安装与基本操作示例

    本文实例讲述了Python Numpy库安装与基本操作.分享给大家供大家参考,具体如下: 概述 NumPy(Numeric Python)扩展包提供了数组功能,以及对数据进行快速处理的函数. NumP ...

  2. python numpy库 一些统计量计算

    import numpy as np # a = np.array([[3,7,5],[8,4,3],[2,4,9]]) # print ('我们的数组是:') # print (a) # print ...

  3. python numpy库安装 mac_教程|如何在mac上为Python安装XGBoost!

    原标题:教程|如何在mac上为Python安装XGBoost! 摘要:XGBoost是一个开发非常快速和准确的梯度增强模型的库,它在Kaggle数据科学竞赛中被大量的kaggle选手选用,其中包括两个 ...

  4. Python Numpy库教程

    目录 1 Numpy概述 1.1 概念 1.2 功能 1.3 对象 1.4 数据类型 1.5 数组属性 2 Numpy数组操作 2.1 Numpy创建 2.1.1 利用列表生成数组 2.1.2 利用r ...

  5. Python Numpy库教程(超详细)

    1 Numpy概述 1.1 概念 Python本身含有列表和数组,但对于大数据来说,这些结构是有很多不足的.由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针.对于数值运算来说这种 结构比较 ...

  6. python numpy库下载_Python Numpy库快速入门

    https://stackedit.io/viewer 1/9 Python 科 学 计 算 库 NumPy 的 使 ⽤ NumPy 的 介 绍 NumPy(Numerical Python 的 缩 ...

  7. python numpy库是第三方库吗_浅谈python的第三方库——numpy(终)

    本文作为numpy系列的总结篇,继续介绍numpy中常见的使用小贴士 1 手动转换矩阵规格 转换矩阵规格,就是在保持原矩阵的元素数量和内容不变的情况下,改变原矩阵的行列数目.比如,在得到一个5x4的矩 ...

  8. python numpy库_numpy库学习总结(基础知识)

    最近在学习Python中OpenCV库,学习花了很多时间,发现基础知识很重要,尤其是numpy这个库,在进行程序开发时,处理大量类似数组这种数据结构时,它的重要性等同于Python中的列表,像前篇我们 ...

  9. python numpy库

    文章目录 NumPy( Numeric Python) numpy的引用 Ndarray 引入n维数组的意义 ndarray的组成 ndarray对象的属性 数据类型 ndarray支持多种数据类型的 ...

最新文章

  1. iOS应用安全之代码混淆实现篇
  2. “裁员” + 滤镜 = “毕业”
  3. [云炬创业基础笔记]第九章企业的法律形态测试4
  4. 数据类型、常量、变量
  5. 搭建nfs,实现linux之间共享存储
  6. 如何使用router-link对象方式传递参数?
  7. PHP + ORACLE 远程连接数据库环境配置
  8. 在中标麒麟上基于源码安装第二个gcc编译器
  9. ps3手柄在linux ubuntu 下的使用
  10. Centos删除文件空间不释放怎么办
  11. c++ 让程序玩贪吃蛇游戏
  12. 库卡机器人坐标手势_库卡机器人为何要几种坐标系?
  13. Microchip最新推出的ATMEGA4809-XPRO开发板简介
  14. 应用服务器的作用是,应用服务器是什么_应用服务器分类_应用服务器作用-与非网...
  15. 2019北航计科保研夏令营(非优营)
  16. RK920C键盘出现输入del键,会输出q信息,输入Ins键会输出1信息
  17. 【Python】【C语言】P3353 在你窗外闪耀的星星
  18. 2019网易笔试(4-7题)
  19. ren域名有价值吗?值不值得投资?ren域名的应用范围有哪些?
  20. [JS]JavaScript基础学习笔记(黑马pink+尚硅谷李立超)

热门文章

  1. 怎么让电脑速度变快_小科普 | 免费的路由器!用你的电脑开5G热点!
  2. beego 访问网络_Go--Beego新建项目(解决不能访问的问题)
  3. cpuz检测硬件真假_一手硬件买不起 淘二手硬件的你知道这些重灾区吗
  4. python 3.7下载安装scrapy_win10上python3.7安装scrapy1.5.1
  5. php伪静态是什么,php路由设置伪静态
  6. python数据写入csv不换行_你还在重复工作?Python轻松读写核对csv表格上万条数据!...
  7. mybatis逆向工程generatorConfiguration详细配置
  8. WebApi 数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。,ExceptionType:System.Security....
  9. 【计算机视觉】期刊整理
  10. 关于miniconda的安装,配置以及包批量安装和使用