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

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

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

cos_doubles.c，C源文件。

cos_doubles.h，C头文件。

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

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

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

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

0 条评论

• ### python根据BM25实现文本检索

目的 给定一个或多个搜索词，如“高血压 患者”，从已有的若干篇文本中找出最相关的(n篇)文本。 理论知识 文本检索（text retrieve）的常用策略是：用...

• ### 前馈神经网络——深度学习之神经网络核心原理与算法

因上几次读者反映，公式代码有乱码和不规整的问题，小编有改善哟，这篇文章开始亲们会看到效果的哟~

• ### Python数据分析模块 | pandas做数据分析(一):基本数据对象

pandas有两个最主要的数据结构，分别是Series和DataFrame，所以一开始的任务就是好好熟悉一下这两个数据结构。 1、Series 官方文档： pa...

• ### 快速教程：使用Cython来扩展Python/NumPy库

北京 | 深度学习与人工智能研修 12月23-24日 ? 再设经典课程 重温深度学习 正文共2583个字，7张图，预计阅读时间：7分钟。 前言 整个快速教程直接...

• ### SAP MM MB1B + 移动类型321，提示：Enter Goods Receipt Number 之分析与对策

在自己测试的过程中，发现了一个之前从没有遇到过的问题：MB1B 加移动类型321 将质检库存释放到可用库存的事务界面里，输入物料号，数量等信息后，回车，系统弹出...

• ### Python-入门-09-字符串常见函数（上篇）

系统：Windows 7 语言版本：Anaconda3-4.3.0.1-Windows-x86_64 编辑器：pycharm-community-2016.3....

• ### Python中math模块的使用

这些函数大部分的返回结果是浮点数，在代码中，浮点数小数点后面的位数是有限的，而二进制表示小数时很有可能会出现无限循环的小数，因此浮点数会有精度损失，不过，大多数...

• ### 关于单例设计模式

2.使用场景：确保某个类有且只有一个对象的常见，避免产生多个对象消耗过多的资源或者某种类型的对象只应该有且只有一个。

• ### Python中math模块的使用

这些函数大部分的返回结果是浮点数，在代码中，浮点数小数点后面的位数是有限的，而二进制表示小数时很有可能会出现无限循环的小数，因此浮点数会有精度损失，不过，大多数...

• ### 如何设计和实现微信公众号关注后48小时内定时给粉丝自动推送发送图文图片或文本消息?

很多人可能会留意到, 关注了公众号之后,隔一段时间, 公众号会推送消息出来,打开消息后发现这些消息看起来不像人工发送的,应该是设计好的一套关注后的定时推送机制,...