专栏首页企鹅号快讯快速教程:使用Cython来扩展Python/NumPy库

快速教程:使用Cython来扩展Python/NumPy库

北京 | 深度学习与人工智能研修

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

/* 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

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( np.PyArray_DATA(in_array),

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学习

本文来自企鹅号 - 人工智能LeadAI媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Python量化投资】拟合具有非平稳特征的神经网络对股票进行预测

    对建筑行业的股价进行分析预测 一、建筑行业规模 二、建筑行业市值前六公司 中国建筑 - 601668.SH 中国交建 - 601800.SH 中国中铁 - ...

    量化投资与机器学习微信公众号
  • 可能是史上最全机器学习和Python速查表(附下载链接)

    来源:网路冷眼 作者:Hanson 本文长度为680字,建议阅读5分钟 本文为你分享有关机器学习、Python和相关数学知识的速查表大全。 机器学习有很多方面。...

    数据派THU
  • N-CryptoAsset投资组合 | 使用PCA识别高度相关的加密货币(最近听说某币很疯狂哦!)

    前言 在本文中,以每日加密货币价格时间序列为例,以选择其中一个加密货币,通过巧妙地合并,我们将创建一个可存储的(例如HDF5,CSV文件格式)和可重用的N-Cr...

    量化投资与机器学习微信公众号
  • python编程

    使用python编写客户端不是一件很复杂的事情。比如说,基本上不管是mac版本,还是windows版本、linux版本,一般python都默认安装了Tkinte...

    企鹅号小编
  • 【Python量化投资】基于网格优化、遗传算法对CTA策略进行参数优化

    投资策略 基于指数移动平均线的交易系统 多头开仓条件:短期均线上穿长期均线同时长期均线大于更长期均线的值 空头开仓条件:短期均线下穿长期均线同时长期均线小于更长...

    量化投资与机器学习微信公众号
  • 独家 | Python数据分析入门指南

    作者:Zack Jost 翻译:梁傅淇 校对:丁楠雅 本文长度为1500字,建议阅读3分钟 Zack Jost是美国第一资本投资国际集团的首席数据科学家,这是他...

    数据派THU
  • 如何使用LSTM网络进行权重正则化来进行时间序列预测

    作者 / Jason Brownlee 翻译 / 编辑部翻译组 来源 / http://machinelearningmastery.com 权重正则化是一种对...

    量化投资与机器学习微信公众号
  • 【独家发送】机器学习该如何应用到量化投资系列(四)——关于涨跌的思考基于Python

    编辑部 微信公众号 关键字全网搜索 『量化投资』:排名第一 『量 化』:排名第二 『机器学习』:排名第三 我们会再接再厉 成为全网优质的金融、技术技...

    量化投资与机器学习微信公众号
  • 时间序列预测与递归神经网络在Keras的应用基于Python

    编辑整理 编辑部:西西 原文作者 Jason Brownlee 问题描述 问题为:国际客运量预测。该数据范围从 1949 年 1 月至 1960 年 12 月。...

    量化投资与机器学习微信公众号
  • Base4.net和IronPython的一些相关东东

    发现一个非常好的东东:Base4.NET ,这是一个超过10年编程经验的老程序员和架构师所愿意分享和体现的价值, 有兴趣的看看作者的介绍:      Base...

    张善友

扫码关注云+社区

领取腾讯云代金券