Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
apachecn-ds-zh
提交
c89ffb8c
A
apachecn-ds-zh
项目概览
OpenDocCN
/
apachecn-ds-zh
10 个月 前同步成功
通知
1
Star
287
Fork
69
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-ds-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c89ffb8c
编写于
7月 24, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-07-24 19:32:18
上级
d7b88154
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
19 addition
and
19 deletion
+19
-19
docs/numpy-essentials/10.md
docs/numpy-essentials/10.md
+4
-4
docs/numpy-essentials/2.md
docs/numpy-essentials/2.md
+1
-1
docs/numpy-essentials/3.md
docs/numpy-essentials/3.md
+3
-3
docs/numpy-essentials/4.md
docs/numpy-essentials/4.md
+3
-3
docs/numpy-essentials/5.md
docs/numpy-essentials/5.md
+3
-3
docs/numpy-essentials/6.md
docs/numpy-essentials/6.md
+1
-1
docs/numpy-essentials/7.md
docs/numpy-essentials/7.md
+1
-1
docs/numpy-essentials/8.md
docs/numpy-essentials/8.md
+2
-2
docs/numpy-essentials/9.md
docs/numpy-essentials/9.md
+1
-1
未找到文件。
docs/numpy-essentials/10.md
浏览文件 @
c89ffb8c
...
...
@@ -15,7 +15,7 @@ NumPy 是 Python 中功能强大的科学模块; 希望在前九章中,我
您可以从
[
Pandas 官方网站
](
http://pandas.pydata.org/
)
下载并安装 Pandas。 一种更可取的方法是使用 pip 或安装 Python 科学发行版,例如 Anaconda。
还记得我们如何使用
`numpy.genfromtxt()`
读取第 4 章, “Numpy 核心和子模块”中的
`csv`
数据吗? 实际上,使用 Pandas 来读取表格并将经过预处理的数据传递给
`ndarray`
(简单地执行
`np.array(data_frame)`
会将数据帧转换为多维
`ndarray`
)对于分析来说是更可取的工作流程。 在本节中,我们将向您展示 Pandas 的两个基本数据结构:
`Series`
(用于一维)和
`DataFrame`
(用于二维或多维)。然后,我们将向您展示如何使用 Pandas 来读取
表并将数据传递给
还记得我们如何使用
`numpy.genfromtxt()`
读取第 4 章, “Numpy 核心和子模块”中的
`csv`
数据吗? 实际上,使用 Pandas 来读取表格并将经过预处理的数据传递给
`ndarray`
(简单地执行
`np.array(data_frame)`
会将数据帧转换为多维
`ndarray`
)对于分析来说是更可取的工作流程。 在本节中,我们将向您展示 Pandas 的两个基本数据结构:
`Series`
(用于一维)和
`DataFrame`
(用于二维或多维)。然后,我们将向您展示如何使用 Pandas 来读取
表并将数据传递给它。
然后,我们将向您展示如何使用 Pandas 读取表并将数据传递给
`ndarray`
进行进一步分析。 让我们从
`pandas.Series`
开始:
...
...
@@ -170,7 +170,7 @@ random_state = 50)
```
在前面的示例中,我们使用
`train_test_split()`
函数将糖尿病数据集分为训练和测试数据集(针对数据及其类别)。 前两个参数是我们要拆分的数组。
`random_state`
参数是可选的,这意味着伪随机数生成器状态用于随机采样。 默认拆分率是 0.25,这意味着 75
%的数据拆分为训练集,而 25%
的数据拆分为测试集。 您可以尝试打印出我们刚刚创建的训练/测试数据集,以查看其分布情况(在前面的代码示例中,
`X_train`
代表糖尿病数据的训练数据集,
`X_test`
代表糖尿病测试数据,
`y_train`
代表分类的糖尿病训练数据,
`y_test`
代表分类的糖尿病测试数据。
在前面的示例中,我们使用
`train_test_split()`
函数将糖尿病数据集分为训练和测试数据集(针对数据及其类别)。 前两个参数是我们要拆分的数组。
`random_state`
参数是可选的,这意味着伪随机数生成器状态用于随机采样。 默认拆分率是 0.25,这意味着 75
% 的数据拆分为训练集,而 25%
的数据拆分为测试集。 您可以尝试打印出我们刚刚创建的训练/测试数据集,以查看其分布情况(在前面的代码示例中,
`X_train`
代表糖尿病数据的训练数据集,
`X_test`
代表糖尿病测试数据,
`y_train`
代表分类的糖尿病训练数据,
`y_test`
代表分类的糖尿病测试数据。
接下来,我们将数据集拟合为线性回归模型:
...
...
@@ -219,7 +219,7 @@ netCDF4 是 netCDF 库的第四个版本,该库是在 HDF5(分层数据格
您可以从
[
官方文档页面
](
http://unidata.github.io/netcdf4-python/
)
,或从
[
这里
](
https://github.com/Unidata/netcdf4-python
)
下载并安装该模块。 它不包含在标准的 Python Scientific 发行版中,但已内置在 NumPy 中,可以与 Cython 一起构建(建议但并非必需)。
对于以下示例,我们将使用 Unidata 网站上的示例
`netCDF4`
文件,该文件位于
[
这里
](
http://www.unidata.ucar.edu/software/netcdf/examples/files.html
)
,并且
我们将以气候系统模型为例:
`sresa1b_ncar_ccsm3-example.nc`
对于以下示例,我们将使用 Unidata 网站上的示例
`netCDF4`
文件,该文件位于
[
这里
](
http://www.unidata.ucar.edu/software/netcdf/examples/files.html
)
,并且我们将以气候系统模型为例:
`sresa1b_ncar_ccsm3-example.nc`
首先,我们将使用
`netCDF4`
模块稍微探索一下数据集,并提取我们需要进行进一步分析的值:
...
...
@@ -370,4 +370,4 @@ In [18]: plt.show()
NumPy 当然是使用 Python 进行科学计算的核心:许多模块都基于 NumPy。 尽管有时您可能会发现 NumPy 没有分析模块,但它无疑为您提供了一种接触广泛科学模块的方法。
我们希望本书的最后一章为您提供了一个关于将这些模块与 NumPy 一起使用的好主意,并使您的脚本更加有效(本书中无法涵盖很多便捷的 NumPy 模块;仅在 GitHub 上度过了一个下午 或 PyPI,您可能会发现其中的少数几个)。 最后但并非最不重要的一点,感谢您花时间与我们一起完成许多功能。 现在与 NumPy 一起玩吧!
\ No newline at end of file
我们希望本书的最后一章为您提供了一个关于将这些模块与 NumPy 一起使用的好主意,并使您的脚本更加有效(本书中无法涵盖很多便捷的 NumPy 模块;仅在 GitHub 或 PyPI 上度过一个下午,您可能会发现其中的少数几个)。 最后但并非最不重要的一点,感谢您花时间与我们一起完成许多功能。 现在与 NumPy 一起玩吧!
\ No newline at end of file
docs/numpy-essentials/2.md
浏览文件 @
c89ffb8c
...
...
@@ -28,7 +28,7 @@ from numpy import *
```
因为它可能会覆盖全局名称空间中已经存在的许多功能,所以不建议这样做。 这可能会导致您的代码出现意外行为,并可能在其中引入非常细小的错误。 这也可能会在代码本身中造成冲突(例如 numPy 具有
`any`
并会与系统
`any`
关键字发生冲突),并可能在检查或调试一段代码时引起混乱。 因此,重要的是建议始终使用带有显式名称的导入 numPy,例如第一行中使用的
`np`
约定:-
`import numpy as np`
,这是用于导入目的的标准约定,因为它有助于
开发人员找出功能的来源。 这可以避免大型程序中的许多混乱。
因为它可能会覆盖全局名称空间中已经存在的许多功能,所以不建议这样做。 这可能会导致您的代码出现意外行为,并可能在其中引入非常细小的错误。 这也可能会在代码本身中造成冲突(例如 numPy 具有
`any`
并会与系统
`any`
关键字发生冲突),并可能在检查或调试一段代码时引起混乱。 因此,重要的是建议始终使用带有显式名称的导入 numPy,例如第一行中使用的
`np`
约定:-
`import numpy as np`
,这是用于导入目的的标准约定,因为它有助于开发人员找出功能的来源。 这可以避免大型程序中的许多混乱。
如我们将看到的,可以用多种方式创建 NumPy 数组。 创建数组的最简单方法之一是使用
`array`
函数。 注意,我们向函数传递了一个列表列表,组成列表的长度相等。 每个组成列表成为数组中的一行,并且这些列表的元素填充了结果数组的列。
`array`
函数可以在列表甚至嵌套列表上调用。 由于此处输入的嵌套级别是 2,因此生成的数组是二维的。 这意味着可以使用两个整数集对数组进行索引。 计算数组维数的最简单方法是检查数组的
`ndim`
属性:
...
...
docs/numpy-essentials/3.md
浏览文件 @
c89ffb8c
...
...
@@ -30,7 +30,7 @@ Out[5]: array([-1, 4, 9, 0])
```
两个 NumPy 数组逐个元素相乘。 在前面的示例中,两个数组的形状相同,因此此处不应用广播(我们将在后面的部分中解释不同的形状,NumPy Array 操作和广播规则。)数组
`x`
中的第一个元素乘以
数组
`y`
中的第一个元素,依此类推。 这里要注意的重要一点是,两个 NumPy 数组之间的算术运算不是矩阵乘法。 结果仍然返回相同形状的 NumPy 数组。 NumPy 中的矩阵乘法将使用
`numpy.dot()`
。 看一下这个例子:
两个 NumPy 数组逐个元素相乘。 在前面的示例中,两个数组的形状相同,因此此处不应用广播(我们将在后面的部分中解释不同的形状,NumPy Array 操作和广播规则。)数组
`x`
中的第一个元素乘以数组
`y`
中的第一个元素,依此类推。 这里要注意的重要一点是,两个 NumPy 数组之间的算术运算不是矩阵乘法。 结果仍然返回相同形状的 NumPy 数组。 NumPy 中的矩阵乘法将使用
`numpy.dot()`
。 看一下这个例子:
```
py
In
[
6
]:
np
.
dot
(
x
,
y
)
...
...
@@ -58,7 +58,7 @@ In [11]: %timeit [i + 1 for i in y]
```
`x `
和
`y`
这两个变量的长度相同,并且执行相同的工作,其中包括向数组中的所有元素添加值。 在 NumPy 操作的帮助下,性能比普通的 Python
`for`
循环要快得多(我们在这里使用列表推导来编写整洁的代码,这比普通的 Python
`for`
循环要快,但是
NumPy 的性能却更好 与普通的 Python
`for`
循环相比
)。 知道这个巨大的区别可以通过用 NumPy 操作替换循环来帮助您加速代码。
`x `
和
`y`
这两个变量的长度相同,并且执行相同的工作,其中包括向数组中的所有元素添加值。 在 NumPy 操作的帮助下,性能比普通的 Python
`for`
循环要快得多(我们在这里使用列表推导来编写整洁的代码,这比普通的 Python
`for`
循环要快,但是
与普通的 Python
`for`
循环相比,NumPy 的性能却更好
)。 知道这个巨大的区别可以通过用 NumPy 操作替换循环来帮助您加速代码。
正如我们在前面的示例中提到的,性能的提高归因于 NumPy 数组中一致的
`dtype`
。 可以帮助您正确使用 NumPy 数组的技巧是在执行任何操作之前始终考虑
`dtype`
,因为您很可能会在大多数编程语言中进行此操作。 下面的示例将为您展示使用相同操作的巨大不同结果,但这是基于不同的
`dtype`
数组:
...
...
@@ -328,7 +328,7 @@ Out[60]: array([False, False, True, False, False, True], dtype=bool)
```
从前面的示例中我们可以看到,通过应用
`<`
逻辑符号,我们将标量应用于 NumPy 数组,并将新数组命名为
`mask`
,它仍被向量化并返回
`True`
/
`False `
布尔值 具有相同形状的变量
`x`
表示
`x`
中的哪个元素符合标准:
从前面的示例中我们可以看到,通过应用
`<`
逻辑符号,我们将标量应用于 NumPy 数组,并将新数组命名为
`mask`
,它仍被向量化并返回
与
`x`
形状相同的
`True`
/
`False `
布尔值,
表示
`x`
中的哪个元素符合标准:
```
py
In
[
61
]:
x
[
mask
]
=
0
...
...
docs/numpy-essentials/4.md
浏览文件 @
c89ffb8c
...
...
@@ -11,7 +11,7 @@
# 步幅
步幅是 NumPy 数组中的索引方案,它指示要跳转以查找下一个元素的字节数。 我们都知道 NumPy 的性能改进来自具有固定大小项的同构多维数组对象
`numpy.ndarray`
对象。 我们已经讨论了
`ndarray`
对象的
`shape`
(维度),数据类型和顺序(C 风格的行主要索引数组和 Fortran 风格的列主要数组)。现在
该讨论
仔细看看
**步幅**
。
步幅是 NumPy 数组中的索引方案,它指示要跳转以查找下一个元素的字节数。 我们都知道 NumPy 的性能改进来自具有固定大小项的同构多维数组对象
`numpy.ndarray`
对象。 我们已经讨论了
`ndarray`
对象的
`shape`
(维度),数据类型和顺序(C 风格的行主要索引数组和 Fortran 风格的列主要数组)。现在
让我们
仔细看看
**步幅**
。
让我们首先创建一个 NumPy 数组并更改其形状以查看步幅的差异。
...
...
@@ -143,7 +143,7 @@ array(['NumPy', 'Essential'], dtype='|S10')
```
检索数据的方式保持不变,我们使用索引来获取记录,但是此外,我们可以使用字段名称来获取某些字段的值,因此在上一个示例中,我们使用
`f2`
来获取字符串
领域
。 在下面的示例中,我们将创建名为
`y`
的
`x`
视图,并查看其如何与原始记录数组交互:
检索数据的方式保持不变,我们使用索引来获取记录,但是此外,我们可以使用字段名称来获取某些字段的值,因此在上一个示例中,我们使用
`f2`
来获取字符串
字段
。 在下面的示例中,我们将创建名为
`y`
的
`x`
视图,并查看其如何与原始记录数组交互:
```
py
In
[
25
]:
y
=
x
[
'f0'
]
...
...
@@ -311,7 +311,7 @@ Out[56]:
## 文件 I/O 和 NumPy
现在我们可以执行 NumPy 数组计算和操作,并且知道如何构造记录数组,现在是时候进行一些实际的分析了,方法是将文件读入 NumPy 数组并将结果数组输出到文件中以进行进一步的分析
分析
。
现在我们可以执行 NumPy 数组计算和操作,并且知道如何构造记录数组,现在是时候进行一些实际的分析了,方法是将文件读入 NumPy 数组并将结果数组输出到文件中以进行进一步的分析。
我们应该谈论先读取文件然后导出文件。 但是现在,我们将逆转此过程,先创建一个记录数组,然后将其输出到 CSV 文件。 我们将导出的 CSV 文件读入 NumPy 记录数组,并将其与原始记录数组进行比较。 我们将要创建的样本数组将包含一个带有连续整数的
`id`
字段,一个包含随机浮点数的
`value`
字段和一个带有
`numpy.datetime64['D']`
的
`date`
字段。 本练习将使用您从前面的章节中获得的所有知识。 让我们开始创建记录数组:
...
...
docs/numpy-essentials/5.md
浏览文件 @
c89ffb8c
...
...
@@ -290,7 +290,7 @@ Out[48]:
```
`ndarrayz`
是实型(
`numpy.float64`
),因此在计算特征值时会自动四舍五入。 从理论上讲,特征值应为
`1 ± 1e-10`
,但从第一个
`np.linalg.eig()`
可以看出
特征值都向上舍入为
`1`
。
`ndarrayz`
是实型(
`numpy.float64`
),因此在计算特征值时会自动四舍五入。 从理论上讲,特征值应为
`1 ± 1e-10`
,但从第一个
`np.linalg.eig()`
可以看出特征值都向上舍入为
`1`
。
`svd`
可以认为是特征值的扩展。 我们可以使用
`numpy.linalg.svd()`
分解
`M x N`
数组,所以让我们从一个简单的例子开始:
...
...
@@ -464,7 +464,7 @@ Out[82]: True
在这种情况下,我们将只使用 100 作为总人口,并模拟年龄和睡眠得分,其分布与调查结果相同。 我们想知道他们的年龄在增长,睡眠质量(分数)增加还是减少? 如您所知,这是一个隐藏的线性回归实践。 一旦我们绘制了年龄和睡眠分数的回归线,通过观察该线的斜率,就可以得出答案。
但是在讨论应该使用哪个 NumPy 函数以及如何使用它之前,让我们首先创建数据集。 根据调查,我们知道 20 岁以下的参与者占 7
%,21 岁至 30 岁的参与者占 24%,31 岁至 40 岁的参与者占 21%,60 岁以上的参与者占 21%。因此,我们首先创建一个代表每个参与者人数的组列表 年龄组
,并使用
`numpy.random.randint()`
模拟我们 100 个人口中的实际年龄,以查看年龄变量。 现在我们知道了每个年龄段的睡眠分数分布,我们称其为
`scores`
:这是
`[5.5, 5.7, 5.4, 4.9, 4.6, 4.4]`
的列表,
`[5.5, 5.7, 5.4, 4.9, 4.6, 4.4]`
是根据年龄段从最小到最大的顺序排列的。 在这里,我们还使用
`np.random.rand()`
函数以及均值(来自分数列表)和标准方差(均设置为
`0.01`
)来模拟分数分布(当然,如果您有一个好的数据集,则可以使用) ,最好只使用上一章介绍的
`numpy.genfromtxt()`
函数):
但是在讨论应该使用哪个 NumPy 函数以及如何使用它之前,让我们首先创建数据集。 根据调查,我们知道 20 岁以下的参与者占 7
%,21 岁至 30 岁的参与者占 24%,31 岁至 40 岁的参与者占 21%,60 岁以上的参与者占 21% 。因此,我们首先创建一组列表,代表每个年龄组的人数
,并使用
`numpy.random.randint()`
模拟我们 100 个人口中的实际年龄,以查看年龄变量。 现在我们知道了每个年龄段的睡眠分数分布,我们称其为
`scores`
:这是
`[5.5, 5.7, 5.4, 4.9, 4.6, 4.4]`
的列表,
`[5.5, 5.7, 5.4, 4.9, 4.6, 4.4]`
是根据年龄段从最小到最大的顺序排列的。 在这里,我们还使用
`np.random.rand()`
函数以及均值(来自分数列表)和标准方差(均设置为
`0.01`
)来模拟分数分布(当然,如果您有一个好的数据集,则可以使用) ,最好只使用上一章介绍的
`numpy.genfromtxt()`
函数):
```
py
In
[
83
]:
groups
=
[
7
,
24
,
21
,
19
,
17
,
12
]
...
...
@@ -512,7 +512,7 @@ Out[92]: 6.30307651938
```
现在我们有斜率
`m`
和常数
`c`
。 我们的回归线是
`y = -0.0294x + 6.3031`
,这表明,随着年龄的增长,人的
年龄会略有下降 在他们的睡眠分数/质量中
,如下图所示:
现在我们有斜率
`m`
和常数
`c`
。 我们的回归线是
`y = -0.0294x + 6.3031`
,这表明,随着年龄的增长,人的
睡眠分数/质量会略有下降
,如下图所示:
![
Application - regression and curve fitting
](
img/00015.jpeg
)
...
...
docs/numpy-essentials/6.md
浏览文件 @
c89ffb8c
...
...
@@ -39,7 +39,7 @@ def show(ori_func, ft, sampling_period = 5):
```
这是一个名为
`show()`
的显示函数,它具有两个输入参数:第一个是原始信号函数(
`ori_func`
),第二个是其傅里叶变换(
`ft`
)。 此方法将使用
`matplotlib.pyplot`
模块创建两个折线图:顶部带有黑线的原始信号,其中
*x*
轴表示时间间隔(
我们设置了默认值 在我们所有的示例中
,信号采样周期为 5 秒),
*y*
轴代表信号的幅度。 图表的下部是带有红线的傅里叶变换,其中
*x*
轴表示频率,
*y*
轴代表振幅频谱。
这是一个名为
`show()`
的显示函数,它具有两个输入参数:第一个是原始信号函数(
`ori_func`
),第二个是其傅里叶变换(
`ft`
)。 此方法将使用
`matplotlib.pyplot`
模块创建两个折线图:顶部带有黑线的原始信号,其中
*x*
轴表示时间间隔(
在我们所有的示例中,我们设置了默认值
,信号采样周期为 5 秒),
*y*
轴代表信号的幅度。 图表的下部是带有红线的傅里叶变换,其中
*x*
轴表示频率,
*y*
轴代表振幅频谱。
在下一节中,我们将简单地介绍不同类型的信号波,并使用
`numpy.fft`
模块计算傅立叶变换。 然后我们调用
`show()`
函数以提供它们之间的视觉比较。
...
...
docs/numpy-essentials/7.md
浏览文件 @
c89ffb8c
...
...
@@ -32,7 +32,7 @@
# 建立第一个工作发行版
我们前面提到的所有工具(
`setuptools`
,
`Distutils`
和
`numpy.distutils`
)都围绕功能设置。 为了了解大多数包装要求,我们将研究一个简单的设置功能,然后研究一个成熟的安装程序。 要创建基本的安装程序,我们需要使用有关程序包的元数据调用安装程序功能。 让我们叫第一个包
`py_hello`
,它只有一个功能
`greeter`
,并且在调用时只打印一条消息。 可从
[
的 Bitbucket 存储库下载该程序包 https://bitbucket.org/tdatta/books/src/af376df081ef/python/simple_setup/?at=master
](
https://bitbucket.org/tdatta/books/src/af376df081ef/python/simple_setup/?at=master
)
该项目的项目目录结构如下 以
下:
我们前面提到的所有工具(
`setuptools`
,
`Distutils`
和
`numpy.distutils`
)都围绕功能设置。 为了了解大多数包装要求,我们将研究一个简单的设置功能,然后研究一个成熟的安装程序。 要创建基本的安装程序,我们需要使用有关程序包的元数据调用安装程序功能。 让我们叫第一个包
`py_hello`
,它只有一个功能
`greeter`
,并且在调用时只打印一条消息。 可从
[
Bitbucket 存储库下载该程序包
](
https://bitbucket.org/tdatta/books/src/af376df081ef/python/simple_setup/?at=master
)
。该项目的目录结构如
下:
```
py
py_hello
...
...
docs/numpy-essentials/8.md
浏览文件 @
c89ffb8c
...
...
@@ -2,7 +2,7 @@
Python 与 NumPy 库相结合为用户提供了编写高度复杂的函数和分析的工具。 随着代码的大小和复杂性的增长,代码库中的低效率问题开始蔓延。一旦项目进入完成阶段,开发人员就应开始关注代码的性能并分析瓶颈。 Python 提供了许多工具和库来创建优化且性能更快的代码。
在本章中,我们将研究一种名为 Cython 的工具。 Cython 是 Python 和“Cython”语言的静态编译器,在从事科学
图书馆
/数值计算的开发人员中特别流行。 许多用 Python 编写的著名分析库都大量使用 Cython(Pandas,SciPy,scikit-learn 等)。
在本章中,我们将研究一种名为 Cython 的工具。 Cython 是 Python 和“Cython”语言的静态编译器,在从事科学
库
/数值计算的开发人员中特别流行。 许多用 Python 编写的著名分析库都大量使用 Cython(Pandas,SciPy,scikit-learn 等)。
Cython 编程语言是 Python 的超集,用户仍然喜欢 Python 所提供的所有功能和更高层次的结构。 在本章中,我们将研究 Cython 起作用的许多原因,并且您将学习如何将 Python 代码转换为 Cython。 但是,本章不是 Cython 的完整指南。
...
...
@@ -30,7 +30,7 @@ Cython 编程语言是 Python 的超集,用户仍然喜欢 Python 所提供的
Cython 是一个将类型定义的 Python 代码转换为 C 代码的编译器,该代码仍在 Python 环境中运行。 最终输出是本机代码,其运行速度比 Python 生成的字节码快得多。 在大量使用循环的代码中,Python 代码加速的幅度更加明显。 为了编译 C 代码,首要条件是在计算机上安装 C/C++ 编译器,例如
`gcc`
(Linux)或
`mingw`
(Windows)。
第二步是安装 Cython。 Cython 与其他带有 Python 模块的库一样,可以使用任何首选的方法(pip,easy_install 等)进行安装。 完成这两个步骤后,您可以通过尝试从 Shell 调用 Cython 来测试设置。 如果收到错误消息,则说明您错过了第二步,需要重新安装 Cython 或从
[
Cython 官方网站
](
http://cython.org/#download
)
下载 TAR 归档文件,然后
从此
下载的
`root`
文件夹中运行以下命令:
第二步是安装 Cython。 Cython 与其他带有 Python 模块的库一样,可以使用任何首选的方法(pip,easy_install 等)进行安装。 完成这两个步骤后,您可以通过尝试从 Shell 调用 Cython 来测试设置。 如果收到错误消息,则说明您错过了第二步,需要重新安装 Cython 或从
[
Cython 官方网站
](
http://cython.org/#download
)
下载 TAR 归档文件,然后
从这次
下载的
`root`
文件夹中运行以下命令:
```
py
python
setup
.
py
install
...
...
docs/numpy-essentials/9.md
浏览文件 @
c89ffb8c
# 九、NumPy C-API 简介
NumPy 是一个通用库,旨在满足科学应用程序开发人员的大多数需求。 但是,随着应用程序的代码库和覆盖范围的增加,计算也随之增加,有时用户需要更具体的操作和优化的代码段。 我们已经展示了 NumPy 和 Python 如何具有诸如 f2py 和 Cython 之类的工具来满足这些需求。 这些工具可能是将函数重写为本地编译代码以提高速度的绝佳选择。 但是在某些情况下(利用 C 库,例如
**NAG**
编写一些分析),您可能想做一些更根本的事情,例如
专门创建新的数据结构 为您自己的图书馆
。 这将要求您有权访问 Python 解释器中的低级控件。 在本章中,我们将研究如何使用 Python 及其扩展名 NumPy C-API 提供的 C-API 进行此操作。 C-API 本身是一个非常广泛的主题,可能需要一本书才能完全涵盖它。 在这里,我们将提供简短的介绍和示例,以帮助您开始使用 NumPy C-API。
NumPy 是一个通用库,旨在满足科学应用程序开发人员的大多数需求。 但是,随着应用程序的代码库和覆盖范围的增加,计算也随之增加,有时用户需要更具体的操作和优化的代码段。 我们已经展示了 NumPy 和 Python 如何具有诸如 f2py 和 Cython 之类的工具来满足这些需求。 这些工具可能是将函数重写为本地编译代码以提高速度的绝佳选择。 但是在某些情况下(利用 C 库,例如
**NAG**
编写一些分析),您可能想做一些更根本的事情,例如
为您自己的库专门创建新的数据结构
。 这将要求您有权访问 Python 解释器中的低级控件。 在本章中,我们将研究如何使用 Python 及其扩展名 NumPy C-API 提供的 C-API 进行此操作。 C-API 本身是一个非常广泛的主题,可能需要一本书才能完全涵盖它。 在这里,我们将提供简短的介绍和示例,以帮助您开始使用 NumPy C-API。
本章将涉及的主题是:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录