提交 3517f0f4 编写于 作者: W wizardforcel

2020-07-24 10:00:22

上级 27bed662
......@@ -8,25 +8,25 @@
# 这本书涵盖的内容
[第 1 章](../Text/1.html#E9OE1-7febf188d2c44542a50efe01951015f9 "Chapter 1. An Introduction to NumPy")*NumPy 简介* 是本书的入门章节,它提供了帮助您设置环境的说明。 首先介绍科学 Python 模块系列(SciPy Stack),并说明 NumPy 在 Python 科学计算中所起的关键作用。
第 1 章,“NumPy 简介”是本书的入门章节,它提供了帮助您设置环境的说明。 首先介绍科学 Python 模块系列(SciPy Stack),并说明 NumPy 在 Python 科学计算中所起的关键作用。
[第 2 章](../Text/2.html#K0RQ1-7febf188d2c44542a50efe01951015f9 "Chapter 2. The NumPy ndarray Object")*NumPy ndarray 对象* 涵盖了 NumPy ndarray 对象的基本用法,包括初始化,基本属性,数据类型和内存布局。 它还涵盖了操作下的理论,使您可以清晰地了解 ndarray。
第 2 章,“NumPy `ndarray`对象”涵盖了 NumPy ndarray 对象的基本用法,包括初始化,基本属性,数据类型和内存布局。 它还涵盖了操作下的理论,使您可以清晰地了解 ndarray。
[第 3 章](../Text/3.html#QMFO1-7febf188d2c44542a50efe01951015f9 "Chapter 3. Using NumPy Arrays")*使用 Numpy 数组* 是有关 NumPy ndarray 使用的高级章节,该章延续了第 2 章 NumPy ndarray 对象。 它涵盖了 NumPy 中的通用功能,并向您展示了加快代码速度的技巧。 它还显示形状控制和广播规则。
第 3 章,“使用 Numpy 数组”是有关 NumPy ndarray 使用的高级章节,该章延续了第 2 章 NumPy ndarray 对象。 它涵盖了 NumPy 中的通用功能,并向您展示了加快代码速度的技巧。 它还显示形状控制和广播规则。
[第 4 章](../Text/4.html#10DJ42-7febf188d2c44542a50efe01951015f9 "Chapter 4. NumPy Core and Libs Submodules")*Numpy 核心和库子模块* 包括两个部分。 第一部分详细说明了 NumPy ndarray 分配内存的方式与 CPU 缓存的交互之间的关系。 本章的第二部分介绍了特殊的 NumPy 数组,其中包含多种数据类型(结构/记录数组)。 此外,本章还将探讨 NumPy 中的实验性 datetime64 模块。
第 4 章,“Numpy 核心和子模块”包括两个部分。 第一部分详细说明了 NumPy ndarray 分配内存的方式与 CPU 缓存的交互之间的关系。 本章的第二部分介绍了特殊的 NumPy 数组,其中包含多种数据类型(结构/记录数组)。 此外,本章还将探讨 NumPy 中的实验性 datetime64 模块。
[第 5 章](../Text/5.html#1394Q2-7febf188d2c44542a50efe01951015f9 "Chapter 5. Linear Algebra in NumPy")*NumPy 中的线性代数* 从利用线性代数模块的矩阵和数学计算开始。 它向您展示了解决数学问题的多种方法:使用矩阵,向量分解和多项式。 它还提供了曲线拟合和回归的具体实践。
第 5 章,“NumPy 中的线性代数”从利用线性代数模块的矩阵和数学计算开始。 它向您展示了解决数学问题的多种方法:使用矩阵,向量分解和多项式。 它还提供了曲线拟合和回归的具体实践。
[第 6 章](../Text/6.html#190861-7febf188d2c44542a50efe01951015f9 "Chapter 6. Fourier Analysis in NumPy")*NumPy 中的傅立叶分析* 涵盖了使用 NumPy FFT 模块进行的信号处理以及傅立叶在放大信号/放大图像时的失真应用。 它还提供了 Python 中 matplotlib 软件包的基本用法。
第 6 章,“NumPy 中的傅立叶分析”涵盖了使用 NumPy FFT 模块进行的信号处理以及傅立叶在放大信号/放大图像时的失真应用。 它还提供了 Python 中 matplotlib 软件包的基本用法。
[第 7 章](../Text/7.html#1DOR01-7febf188d2c44542a50efe01951015f9 "Chapter 7. Building and Distributing NumPy Code")*构建和分发 NumPy 代码* 涵盖了有关使用 Python 打包和发布代码的基本细节。 它基本介绍了 NumPy 特定的安装文件以及如何构建扩展模块。
第 7 章,“构建和分发 NumPy 代码”涵盖了有关使用 Python 打包和发布代码的基本细节。 它基本介绍了 NumPy 特定的安装文件以及如何构建扩展模块。
[第 8 章](../Text/8.html#1JFUC1-7febf188d2c44542a50efe01951015f9 "Chapter 8. Speeding Up NumPy with Cython")*使用 Cython 加速 NumPy* ,向用户介绍 Cython 编程语言,并向读者介绍可用于加速现有 Python 代码的技术 。
第 8 章,“使用 Cython 加速 NumPy” ,向用户介绍 Cython 编程语言,并向读者介绍可用于加速现有 Python 代码的技术 。
[第 9 章](../Text/9.html#1P71O1-7febf188d2c44542a50efe01951015f9 "Chapter 9. Introduction to the NumPy C-API")*NumPy C-API 简介* 提供了对 NumPy C API 的基本介绍,以及一般而言,如何编写现有包装程序 C / C ++库。 本章旨在提供一个简短的介绍,并为读者提供有关如何创建新包装程序和了解现有程序的基本知识。
第 9 章,“NumPy C-API 简介”提供了对 NumPy C API 的基本介绍,以及一般而言,如何编写现有包装程序 C/C++ 库。 本章旨在提供一个简短的介绍,并为读者提供有关如何创建新包装程序和了解现有程序的基本知识。
[第 10 章](../Text/10.html#1UU542-7febf188d2c44542a50efe01951015f9 "Chapter 10. Further Reading")*进一步阅读* 是本书的最后一章。 它总结了我们在书中所学的内容,并探索了 4 个依赖于 NumPy 数组的 SciPy 堆栈 Python 模块,这些模块为您提供了进一步科学 Python 编程的想法。
第 10 章,“扩展阅读”是本书的最后一章。 它总结了我们在书中所学的内容,并探索了 4 个依赖于 NumPy 数组的 SciPy 堆栈 Python 模块,这些模块为您提供了进一步科学 Python 编程的想法。
# 这本书需要什么
......@@ -41,7 +41,7 @@
# 这本书适合谁
如果您了解 Python,但对科学编程还是陌生的,并且想进入科学计算的世界,或者您是具有分析经验的 Python 开发人员,但想获得洞察力来增强您的分析技能。 无论哪种情况,NumPy 或这本书都是您的理想选择。 学习 NumPy 以及如何将 NumPy 应用于 Python 程序非常适合作为构建专业分析应用程序的下一步。 熟悉基本的编程概念和数学会有所帮助,但是不需要任何先验经验。 后面的章节涵盖了诸如程序包分发,加速代码和 C / C ++集成之类的概念,这些概念需要一定数量的编程和调试知识。 假定读者能够在其首选的 OS 中构建 C / C ++程序(在 Linux 和 cygwin / migw 中使用 gcc,在 Windows 中使用 gcc)。
如果您了解 Python,但对科学编程还是陌生的,并且想进入科学计算的世界,或者您是具有分析经验的 Python 开发人员,但想获得洞察力来增强您的分析技能。 无论哪种情况,NumPy 或这本书都是您的理想选择。 学习 NumPy 以及如何将 NumPy 应用于 Python 程序非常适合作为构建专业分析应用程序的下一步。 熟悉基本的编程概念和数学会有所帮助,但是不需要任何先验经验。 后面的章节涵盖了诸如程序包分发,加速代码和 C/C++ 集成之类的概念,这些概念需要一定数量的编程和调试知识。 假定读者能够在其首选的 OS 中构建 C/C++ 程序(在 Linux 和 cygwin / migw 中使用 gcc,在 Windows 中使用 gcc)。
# 约定
......@@ -69,7 +69,7 @@ Out[8]: 4**
```
**新术语****重要词** 用粗体显示。
**新术语****重要词**用粗体显示。
### 注意
......@@ -99,13 +99,13 @@ Out[8]: 4**
1. 使用您的电子邮件地址和密码登录或注册到我们的网站。
2. 将鼠标指针悬停在顶部的 **SUPPORT** 选项卡上。
3. 单击 **代码下载&勘误表**
4. **搜索** 框中输入书籍的名称。
3. 单击**代码下载&勘误表**
4.**搜索**框中输入书籍的名称。
5. 选择您要下载其代码文件的书。
6. 从购买本书的下拉菜单中选择。
7. 点击 **代码下载**
7. 点击**代码下载**
您还可以通过在 Packt Publishing 网站上的书籍网页上单击 **代码文件** 按钮来下载代码文件。 通过在 **搜索** 框中输入书名可以访问该页面。 请注意,您需要登录到 Packt 帐户。
您还可以通过在 Packt Publishing 网站上的书籍网页上单击**代码文件**按钮来下载代码文件。 通过在**搜索**框中输入书名可以访问该页面。 请注意,您需要登录到 Packt 帐户。
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
......@@ -119,9 +119,9 @@ Out[8]: 4**
## 勘误
尽管我们已尽一切努力确保内容的准确性,但还是会发生错误。 如果您发现我们的其中一本书中有错误-可能是文本或代码中的错误-如果您能向我们报告,我们将不胜感激。 这样,您可以使其他读者免于沮丧,并帮助我们改进本书的后续版本。 如果您发现任何勘误,请访问 [http://www.packtpub.com/submit-errata](http://www.packtpub.com/submit-errata) ,选择您的书,然后点击 **勘误提交表格**进行报告。 链接,然后输入勘误的详细信息。 一旦您的勘误得到验证,您的提交将被接受,勘误将被上传到我们的网站或添加到该标题的勘误部分下的任何现有勘误列表中。
尽管我们已尽一切努力确保内容的准确性,但还是会发生错误。 如果您发现我们的其中一本书中有错误-可能是文本或代码中的错误-如果您能向我们报告,我们将不胜感激。 这样,您可以使其他读者免于沮丧,并帮助我们改进本书的后续版本。 如果您发现任何勘误,请访问 [http://www.packtpub.com/submit-errata](http://www.packtpub.com/submit-errata) ,选择您的书,然后点击**勘误提交表格**进行报告。 链接,然后输入勘误的详细信息。 一旦您的勘误得到验证,您的提交将被接受,勘误将被上传到我们的网站或添加到该标题的勘误部分下的任何现有勘误列表中。
要查看先前提交的勘误,请转到 [https://www.packtpub.com/books/content/support](https://www.packtpub.com/books/content/support) ,然后在搜索字段中输入书籍的名称。 所需信息将出现在 **勘误表** 部分下。
要查看先前提交的勘误,请转到 [https://www.packtpub.com/books/content/support](https://www.packtpub.com/books/content/support) ,然后在搜索字段中输入书籍的名称。 所需信息将出现在**勘误表**部分下。
## 盗版
......
......@@ -10,13 +10,13 @@
3. 根据您在步骤 1 中找到的数据来训练模型。请继续进行此操作,直到您对模型的可靠性充满信心为止。
4. 将模型部署为 Web 服务。
通常,在执行这些步骤时,您会发现自己在不同的软件堆栈之间跳转。 第 1 步需要进行大量的网页抓取。 Web 抓取是一个非常普遍的问题,几乎每种编程语言都有一些工具可以抓取 Web(如果您已经在使用 Python,则可能会选择 Beautiful Soup 或 Scrapy)。 第 2 步和第 3 步涉及解决机器学习问题,并且需要使用复杂的数学语言或框架,例如 Weka 或 MATLAB,这只是提供机器学习功能的众多工具中的少数几种。 同样,步骤 4 可以使用许多不同的工具以多种方式实现。 没有一个正确的答案。 由于这个问题已经被许多科学家和软件开发人员充分研究和解决(在一定程度上),因此,找到可行的解决方案并不困难。 但是,诸如稳定性和可伸缩性之类的问题可能会严重限制您在问题的每个步骤中对编程语言,Web 框架或机器学习算法的选择。 这就是 Python 胜过大多数其他编程语言的地方。 前面的所有步骤(以及更多步骤)都只能使用 Python 和一些第三方 Python 库来完成。 这种使用 Python 开发软件的灵活性和便捷性正是使其成为科学计算生态系统的理想宿主。 在 *Python 数据分析* *Ivan Idris* 和中可以找到关于 Python 作为成熟的应用程序开发语言的非常有趣的解释。 ] *Packt Publishing* 。 精确地讲,Python 是一种用于快速原型制作的语言,并且由于其随着时间的推移而获得了广泛的科学生态系统,它也被用于构建生产质量的软件。 这个生态系统的基础是 NumPy。
通常,在执行这些步骤时,您会发现自己在不同的软件堆栈之间跳转。 第 1 步需要进行大量的网页抓取。 Web 抓取是一个非常普遍的问题,几乎每种编程语言都有一些工具可以抓取 Web(如果您已经在使用 Python,则可能会选择 Beautiful Soup 或 Scrapy)。 第 2 步和第 3 步涉及解决机器学习问题,并且需要使用复杂的数学语言或框架,例如 Weka 或 MATLAB,这只是提供机器学习功能的众多工具中的少数几种。 同样,步骤 4 可以使用许多不同的工具以多种方式实现。 没有一个正确的答案。 由于这个问题已经被许多科学家和软件开发人员充分研究和解决(在一定程度上),因此,找到可行的解决方案并不困难。 但是,诸如稳定性和可伸缩性之类的问题可能会严重限制您在问题的每个步骤中对编程语言,Web 框架或机器学习算法的选择。 这就是 Python 胜过大多数其他编程语言的地方。 前面的所有步骤(以及更多步骤)都只能使用 Python 和一些第三方 Python 库来完成。 这种使用 Python 开发软件的灵活性和便捷性正是使其成为科学计算生态系统的理想宿主。 在 *Python 数据分析**Ivan Idris* 和中可以找到关于 Python 作为成熟的应用程序开发语言的非常有趣的解释。 ] *Packt Publishing* 。 精确地讲,Python 是一种用于快速原型制作的语言,并且由于其随着时间的推移而获得了广泛的科学生态系统,它也被用于构建生产质量的软件。 这个生态系统的基础是 NumPy。
**数字 Python****NumPy** )是 Numeric 程序包的后续产品。 它最初由 Travis Oliphant 编写,是 Python 科学计算环境的基础。 它在 2005 年初从功能更广泛的 SciPy 模块分支出来,并于 2006 年中首次稳定发布。 从那以后,它在从事数学,科学和工程领域的 Python 爱好者中越来越受欢迎。 本书的目的是使您对 NumPy 足够熟悉,以便您能够使用它并使用它构建复杂的科学应用程序。
# 科学的 Python 堆栈
让我们首先简要浏览一下 **科学 Python****SciPy** )堆栈。
让我们首先简要浏览一下**科学 Python****SciPy** )堆栈。
### 注意
......@@ -30,7 +30,7 @@ IPython 的主要作者 Fernando Perez 在 2012 年加拿大 PyCon 的主题演
> *“科学计算的发展不仅仅是因为软件的发展,而且还因为我们作为科学家所做的不仅仅是浮点运算。”*
这正是 SciPy 堆栈拥有如此丰富的功能的原因。 大多数 SciPy 堆栈的演进是由试图以通用编程语言解决科学和工程问题的科学家和工程师团队推动的。 对 NumPy 为什么如此重要的一个单方面的解释是,它提供了科学计算中大多数任务所必需的核心多维数组对象。 这就是为什么它是 SciPy 堆栈的根本原因。 NumPy 使用久经考验的科学库,提供了一种简单的方法来与遗留的 Fortran 和 C / C ++数字代码对接,我们知道该库已经运行了数十年。 全世界的公司和实验室都使用 Python 将已经存在很长时间的遗留代码粘合在一起。 简而言之,这意味着 NumPy 允许我们站在巨人的肩膀上。 我们不必重新发明轮子。 这是每个其他 SciPy 软件包的依赖项。 NumPy `ndarray`对象实际上是下一章的主题,它是 Pythonic 接口,用于用 Fortran,C 和 C ++编写的库所使用的数据结构。 实际上,NumPy `ndarray`对象使用的内部内存布局实现 C 和 Fortran 布局。 这将在以后的章节中详细讨论。
这正是 SciPy 堆栈拥有如此丰富的功能的原因。 大多数 SciPy 堆栈的演进是由试图以通用编程语言解决科学和工程问题的科学家和工程师团队推动的。 对 NumPy 为什么如此重要的一个单方面的解释是,它提供了科学计算中大多数任务所必需的核心多维数组对象。 这就是为什么它是 SciPy 堆栈的根本原因。 NumPy 使用久经考验的科学库,提供了一种简单的方法来与遗留的 Fortran 和 C/C++ 数字代码对接,我们知道该库已经运行了数十年。 全世界的公司和实验室都使用 Python 将已经存在很长时间的遗留代码粘合在一起。 简而言之,这意味着 NumPy 允许我们站在巨人的肩膀上。 我们不必重新发明轮子。 这是每个其他 SciPy 软件包的依赖项。 NumPy `ndarray`对象实际上是下一章的主题,它是 Pythonic 接口,用于用 Fortran,C 和 C++ 编写的库所使用的数据结构。 实际上,NumPy `ndarray`对象使用的内部内存布局实现 C 和 Fortran 布局。 这将在以后的章节中详细讨论。
堆栈的下一层包括 SciPy,matplotlib,IPython(Python 的交互式外壳;我们将在整本书中将其用作示例,其安装和使用的详细信息将在后面的部分中提供)以及 SymPy 模块。 SciPy 提供了生态系统主要部分所依赖的大部分科学和数字功能。 Matplotlib 是 Python 中的事实绘图和数据可视化库。 IPython 是用于 Python 中科学计算的日益流行的交互式环境。 实际上,该项目已经进行了如此积极的开发并享有很高的知名度,以至于它不再局限于 Python,而且将其功能扩展到其他科学语言,尤其是 R 和 Julia。 堆栈中的这一层可以看作是 NumPy 的面向核心数组的功能与堆栈较高层提供的特定于域的抽象之间的桥梁。 这些特定于领域的工具通常称为 SciKits-受欢迎的工具包括 scikit-image(图像处理),scikit-learn(机器学习),statsmodels(统计信息),pandas(高级数据分析)等等。 由于科学的 Python 社区非常活跃,因此几乎不可能在 Python 中列出每个科学软件包,并且针对大量的科学问题总是有很多发展。 跟踪项目的最佳方法是参与社区。 加入邮件列表,编写代码,将软件用于日常计算需求并报告错误,这非常有用。 本书的目标之一是使您足够感兴趣,以积极地参与科学的 Python 社区。
......@@ -40,7 +40,7 @@ IPython 的主要作者 Fernando Perez 在 2012 年加拿大 PyCon 的主题演
## 表示矩阵和向量
矩阵和向量的抽象数学概念是许多科学问题的核心。 数组为这些概念提供了直接的语义链接。 确实,每当一本数学文献提到矩阵时,就可以安全地将数组视为代表矩阵的软件抽象。 在科学文献中, *A <sub class="calibre25">ij</sub>* 等表达式通常用于表示 *i* 中的元素 <sup class="calibre26"></sup>*j* <sup class="calibre26">阵列 *A* 的列。 NumPy 中的相应表达将简单地是 *A [i,j]* 。 对于矩阵运算,NumPy 数组还支持矢量化(有关详细信息,请参见[第 3 章](../Text/3.html#QMFO1-7febf188d2c44542a50efe01951015f9 "Chapter 3. Using NumPy Arrays")*使用 NumPy 数组* ),这大大加快了执行速度。 向量化使代码更简洁,更易于阅读,并且更类似于数学符号。 像矩阵一样,数组也可以是多维的。 数组的每个元素都可以通过一组称为 **索引** 的整数来寻址,而访问具有整数集的数组的元素的过程称为 **索引[** 。 确实可以在不使用数组的情况下实现此功能,但这将很麻烦并且非常不必要。</sup>
矩阵和向量的抽象数学概念是许多科学问题的核心。 数组为这些概念提供了直接的语义链接。 确实,每当一本数学文献提到矩阵时,就可以安全地将数组视为代表矩阵的软件抽象。 在科学文献中, *A <sub class="calibre25">ij</sub>* 等表达式通常用于表示 *i* 中的元素 <sup class="calibre26"></sup>*j* <sup class="calibre26">阵列 *A* 的列。 NumPy 中的相应表达将简单地是 *A [i,j]* 。 对于矩阵运算,NumPy 数组还支持矢量化(有关详细信息,请参见第 3 章,“使用 Numpy 数组”),这大大加快了执行速度。 向量化使代码更简洁,更易于阅读,并且更类似于数学符号。 像矩阵一样,数组也可以是多维的。 数组的每个元素都可以通过一组称为**索引**的整数来寻址,而访问具有整数集的数组的元素的过程称为**索引[** 。 确实可以在不使用数组的情况下实现此功能,但这将很麻烦并且非常不必要。</sup>
## 效率
......@@ -48,7 +48,7 @@ IPython 的主要作者 Fernando Perez 在 2012 年加拿大 PyCon 的主题演
## 易于开发
NumPy 模块是用于数学任务的现成功能的强大平台。 它极大地增加了 Python 的开发难度。 以下是该模块包含的内容的简要概述,我们将在本书中探讨其中的大部分内容。 有关 NumPy 模块的详细介绍,请参见权威的 *NumPy 指南**Travis Oliphat* 。 NumPy API 非常灵活,以至于科学 Python 社区已广泛采用它作为构建科学应用程序的标准 API。 可以在 *NumPy 数组:有效数值计算的结构* *Van Der Walt* 以及其他:
NumPy 模块是用于数学任务的现成功能的强大平台。 它极大地增加了 Python 的开发难度。 以下是该模块包含的内容的简要概述,我们将在本书中探讨其中的大部分内容。 有关 NumPy 模块的详细介绍,请参见权威的 *NumPy 指南**Travis Oliphat* 。 NumPy API 非常灵活,以至于科学 Python 社区已广泛采用它作为构建科学应用程序的标准 API。 可以在 *NumPy 数组:有效数值计算的结构**Van Der Walt* 以及其他:
<colgroup class="calibre9"><col class="calibre10"> <col class="calibre10"></colgroup>
| **子模块** | **内容** |
......@@ -109,7 +109,7 @@ C:\Users\JohnDoe> python hello_world.py
### 注意
面向 Canopy 用户的注意事项:可以使用 Canopy GUI,该 GUI 包括嵌入式 IPython 控制台,文本编辑器和 IPython Notebook 编辑器。 使用命令行时,为了获得最佳效果,请使用 Canopy 的“工具”菜单中的 **Canopy 终端**
面向 Canopy 用户的注意事项:可以使用 Canopy GUI,该 GUI 包括嵌入式 IPython 控制台,文本编辑器和 IPython Notebook 编辑器。 使用命令行时,为了获得最佳效果,请使用 Canopy 的“工具”菜单中的 **Canopy 终端**
Windows OS 用户注意事项:除了 Python 发行版,您还可以从 Ghristoph Gohlke 网站上的 [http://www.lfd.uci.edu/~gohlke/pythonlibs/](http://www.lfd.uci.edu/~gohlke/pythonlibs/) 安装预构建的 Windows python 扩展软件包。
......
......@@ -15,7 +15,7 @@ NumPy 是 Python 中功能强大的科学模块; 希望在前九章中,我
您可以从熊猫官方网站 [http://pandas.pydata.org/](http://pandas.pydata.org/) 下载并安装熊猫。 一种更可取的方法是使用 pip 或安装 Python 科学发行版,例如 Anaconda。
还记得我们如何使用`numpy.genfromtxt()`读取[第 4 章](../Text/4.html#10DJ42-7febf188d2c44542a50efe01951015f9 "Chapter 4. NumPy Core and Libs Submodules")*NumPy 核心和库子模块* 中的`csv`数据吗? 实际上,使用熊猫来读取表格并将经过预处理的数据传递给`ndarray`(简单地执行`np.array(data_frame)`会将数据帧转换为多维`ndarray`)对于分析来说是更可取的工作流程。 在本节中,我们将向您展示熊猫的两个基本数据结构:`Series`(用于一维)和`DataFrame`(用于二维或多维)。然后,我们将向您展示如何使用熊猫来读取 表并将数据传递给
还记得我们如何使用`numpy.genfromtxt()`读取第 4 章, “Numpy 核心和子模块”中的`csv`数据吗? 实际上,使用熊猫来读取表格并将经过预处理的数据传递给`ndarray`(简单地执行`np.array(data_frame)`会将数据帧转换为多维`ndarray`)对于分析来说是更可取的工作流程。 在本节中,我们将向您展示熊猫的两个基本数据结构:`Series`(用于一维)和`DataFrame`(用于二维或多维)。然后,我们将向您展示如何使用熊猫来读取 表并将数据传递给
然后,我们将向您展示如何使用熊猫读取表并将数据传递给`ndarray`进行进一步分析。 让我们从`pandas.Series`开始:
......@@ -103,7 +103,7 @@ max 41.000000
在前面的示例中,我们仅获得`Age`列,并按`Age``DataFrame`进行排序。 当我们使用`describe()`时,它将计算所有数字字段的摘要统计信息(包括计数,均值,标准差,最小值,最大值和百分位数)。在本节的最后部分,我们将使用熊猫读取
在本节的最后部分,我们将使用熊猫读取`csv`文件并将一个字段值传递给`ndarray`以进行进一步的计算。 `example.csv`文件来自 **国家统计局****ONS** )。 请访问 [http://www.ons.gov.uk/ons/datasets-and-tables/index.html](http://www.ons.gov.uk/ons/datasets-and-tables/index.html) 了解更多详细信息。 我们将在 ONS 网站上使用 *房屋类型和地方当局(英格兰和威尔士)的销售计数* 。 您可以按主题名称搜索它,以访问下载页面或选择您感兴趣的任何数据集。在以下示例中,我们将示例数据集重命名为`sales.csv`
在本节的最后部分,我们将使用熊猫读取`csv`文件并将一个字段值传递给`ndarray`以进行进一步的计算。 `example.csv`文件来自**国家统计局****ONS** )。 请访问 [http://www.ons.gov.uk/ons/datasets-and-tables/index.html](http://www.ons.gov.uk/ons/datasets-and-tables/index.html) 了解更多详细信息。 我们将在 ONS 网站上使用*房屋类型和地方当局(英格兰和威尔士)的销售计数*。 您可以按主题名称搜索它,以访问下载页面或选择您感兴趣的任何数据集。在以下示例中,我们将示例数据集重命名为`sales.csv`
```py
In [15]: sales = pd.read_csv('sales.csv')
......@@ -159,7 +159,7 @@ Out[4]: (442, 10)
我们从`sklearn.datasets`中加载了一个名为`diabetes`的样本数据集; 它包含 442 个观测值,10 个维度,范围从-2 到 2\. `Toy`数据集还提供了标记数据用于监督学习(如果您不熟悉机器学习,请尝试将标记数据视为类别)。 在我们的示例中,可以从`diabetes.target`调用`diabetes`数据集中的标记数据,范围为 25 到 346。
还记得我们在[第 5 章](../Text/5.html#1394Q2-7febf188d2c44542a50efe01951015f9 "Chapter 5. Linear Algebra in NumPy")*numpy* 中的线性代数中如何进行线性回归吗? 我们将使用 scikit-learn 再次执行它。 同样,我建议您在开发脚本以帮助您进行研究或分析时,请使用 NumPy `ndarray`作为常规数据格式; 但是,对于计算,使用 scipy,scikit-learn 或其他科学模块会更好。 机器学习的优势之一是模型评估(您可以在其中训练和测试结果)。 使用此方法,我们将数据分为两个数据集:训练数据集和测试数据集,然后将这两个数据集传递给线性回归:
还记得我们在第 5 章*numpy* 中的线性代数中如何进行线性回归吗? 我们将使用 scikit-learn 再次执行它。 同样,我建议您在开发脚本以帮助您进行研究或分析时,请使用 NumPy `ndarray`作为常规数据格式; 但是,对于计算,使用 scipy,scikit-learn 或其他科学模块会更好。 机器学习的优势之一是模型评估(您可以在其中训练和测试结果)。 使用此方法,我们将数据分为两个数据集:训练数据集和测试数据集,然后将这两个数据集传递给线性回归:
```py
In [5]: from sklearn.cross_validation import train_test_split
......@@ -312,7 +312,7 @@ In [31]: output.close()
# 科学
SciPy 是一个着名的 Python 库,专注于科学计算(它包含用于优化,线性代数,积分,内插以及诸如 FFT,信号和图像处理等特殊功能的模块)。 它建立在 NumPy 数组对象的基础上,并且 NumPy 是整个 SciPy 堆栈的一部分(请记住,我们在[第 1 章](../Text/1.html#E9OE1-7febf188d2c44542a50efe01951015f9 "Chapter 1. An Introduction to NumPy")*NumPy 简介* )。 但是,SciPy 模块包含各种主题,而我们不能仅在一个部分中进行介绍。 让我们看一个图像处理(降噪)示例,以帮助您了解 SciPy 可以做什么:
SciPy 是一个着名的 Python 库,专注于科学计算(它包含用于优化,线性代数,积分,内插以及诸如 FFT,信号和图像处理等特殊功能的模块)。 它建立在 NumPy 数组对象的基础上,并且 NumPy 是整个 SciPy 堆栈的一部分(请记住,我们在第 1 章, “NumPy 简介”)。 但是,SciPy 模块包含各种主题,而我们不能仅在一个部分中进行介绍。 让我们看一个图像处理(降噪)示例,以帮助您了解 SciPy 可以做什么:
```py
In [1]: from scipy.misc import imread, imsave, ascent
......@@ -323,7 +323,7 @@ In [3]: image_data = ascent()
首先,我们从 SciPy 的其他例程中导入三个函数:`imread``imsave``ascent`。 在下面的示例中,我们使用内置图像`ascent`,它是 512 x 512 灰度图像。 当然,您可以使用自己的图像。 只需调用`imread('your_image_name')`,它将作为`ndarray`加载。
我们在此处导入的`matplotlib`模块的`pyplot`结果仅用于显示图像; 我们在[第 6 章](../Text/6.html#190861-7febf188d2c44542a50efe01951015f9 "Chapter 6. Fourier Analysis in NumPy")*在 NumPy* 中进行了傅里叶分析。 这是内置图像`ascent`
我们在此处导入的`matplotlib`模块的`pyplot`结果仅用于显示图像; 我们在第 6 章,*在 NumPy* 中进行了傅里叶分析。 这是内置图像`ascent`
![SciPy](img/00040.jpeg)
......@@ -364,7 +364,7 @@ In [18]: plt.show()
首先,我们从 SciPy 导入`ndimage`,在`noise_image`上应用高斯滤波器,将`sigma`(高斯内核的标准偏差)设置为`3`,然后将其保存到`gaussian_denoised.png`。 查看上一张图片的左侧。 通常,sigma 越大,图像将越平滑,这意味着细节丢失。 我们应用的第二个过滤器是 Uniform 过滤器,并采用了所有参数的默认值,这将导致上一张图像的右侧。 尽管统一滤波器保留了原始图像的更多细节,但图像仍包含噪点。
上一个示例是使用 SciPy 的简单图像处理示例。 但是,SciPy 不仅可以处理图像处理,还可以执行许多类型的分析/科学计算。 有关详细信息,请参阅 *数值科学计算学习科学**第二版* *Packt Publishing*
上一个示例是使用 SciPy 的简单图像处理示例。 但是,SciPy 不仅可以处理图像处理,还可以执行许多类型的分析/科学计算。 有关详细信息,请参阅*数值科学计算学习科学**第二版**Packt Publishing*
# 摘要
......
......@@ -67,7 +67,7 @@ Out[8]: 4
```
ndarray 对象具有许多有用的方法。 要获取可以在 ndarray 对象上调用的方法的列表,请在 IPython 提示符下键入`array`变量(在前面的示例中为`x`),然后按 **选项卡** [ 。 这应该列出该对象可用的所有方法。 作为练习,尝试与其中一些玩耍。
ndarray 对象具有许多有用的方法。 要获取可以在 ndarray 对象上调用的方法的列表,请在 IPython 提示符下键入`array`变量(在前面的示例中为`x`),然后按**选项卡** [ 。 这应该列出该对象可用的所有方法。 作为练习,尝试与其中一些玩耍。
# 数组索引和切片
......@@ -94,7 +94,7 @@ In [11]: print(x[k, :])
```
冒号可以被认为是 *所有元素* 字符。 因此,前面的语句实际上意味着打印`k` <sup class="calibre26"></sup>行的所有字符。 同样,可以使用`x[:,k]`访问列。 反转数组也类似于反转列表,例如`x[::-1]`
冒号可以被认为是*所有元素*字符。 因此,前面的语句实际上意味着打印`k` <sup class="calibre26"></sup>行的所有字符。 同样,可以使用`x[:,k]`访问列。 反转数组也类似于反转列表,例如`x[::-1]`
数组的索引部分也称为数组的 *slice* ,它创建端口或整个数组的副本(我们将在后面的部分中介绍副本和视图) 。 在数组的上下文中,单词“切片”和“索引”通常可以互换使用。
......@@ -335,7 +335,7 @@ Out[44]: (2, 3, 4)
```
注意传递给两个函数的参数之间的细微差别。 随机函数接受 *元组* 作为参数,并创建维数等于元组长度的数组。 各个尺寸的长度等于元组的元素。 另一方面,`rand`函数采用任意数量的 *整数参数* ,并返回一个随机数组,使得其维数等于传递给该函数的整数参数的数量 ,并且各个维度的长度等于整数参数的值。 因此,前面的代码段中的`x`是三维数组(传递给函数的参数数量),并且`x`的三个维度中的每个维度的长度均为 *2* (每个参数的值)。 `rand``random`的便捷功能。 这两个函数可以互换使用,只要传递的参数分别对两个函数均有效即可。
注意传递给两个函数的参数之间的细微差别。 随机函数接受*元组*作为参数,并创建维数等于元组长度的数组。 各个尺寸的长度等于元组的元素。 另一方面,`rand`函数采用任意数量的*整数参数*,并返回一个随机数组,使得其维数等于传递给该函数的整数参数的数量 ,并且各个维度的长度等于整数参数的值。 因此,前面的代码段中的`x`是三维数组(传递给函数的参数数量),并且`x`的三个维度中的每个维度的长度均为 *2* (每个参数的值)。 `rand``random`的便捷功能。 这两个函数可以互换使用,只要传递的参数分别对两个函数均有效即可。
但是,这两个函数的主要缺点是-它们只能创建浮点数组。 如果我们想要一个随机整数数组,则必须将这些函数的输出转换为整数。 但是,这也是一个重大问题,因为 NumPy 的`int`函数将浮点数截断为最接近 0 的整数(这与`floor`函数等效)。 因此,将`rand``random`的输出强制转换为整数将始终返回零数组,因为这两个函数都返回区间内的浮点数( *0* , [ *1* )。 可以使用`randint`功能解决此问题,如下所示:
......
......@@ -165,7 +165,7 @@ array([[25, 30, 35, 40, 45],
```
如果您需要更高级的功能,则可以考虑构建自己的 ufunc,这可能需要使用 Python-C API,或者您也可以使用 Numba 模块(矢量化装饰器)来实现自定义的 ufunc。 在本章中,我们的目标是了解 NumPy ufunc,因此我们将不介绍自定义的 ufunc。 有关更多详细信息,请参阅 NumPy 的联机文档,名为 *编写自己的 ufunc* ,位于 [http://docs.scipy.org/doc/numpy/user/c- info.ufunc-tutorial.html](http://docs.scipy.org/doc/numpy/user/c-info.ufunc-tutorial.html) 或称为的 Numba 文档*在[上创建 Numpy 通用函数](http://numba.pydata.org/numba-doc/dev/user/vectorize.html)* http://numba.pydata.org/numba-doc/ dev / user / vectorize.html 。
如果您需要更高级的功能,则可以考虑构建自己的 ufunc,这可能需要使用 Python-C API,或者您也可以使用 Numba 模块(矢量化装饰器)来实现自定义的 ufunc。 在本章中,我们的目标是了解 NumPy ufunc,因此我们将不介绍自定义的 ufunc。 有关更多详细信息,请参阅 NumPy 的联机文档,名为*编写自己的 ufunc* ,位于 [http://docs.scipy.org/doc/numpy/user/c- info.ufunc-tutorial.html](http://docs.scipy.org/doc/numpy/user/c-info.ufunc-tutorial.html) 或称为的 Numba 文档*在[上创建 Numpy 通用函数](http://numba.pydata.org/numba-doc/dev/user/vectorize.html)* http://numba.pydata.org/numba-doc/ dev / user / vectorize.html 。
# 广播和形状处理
......@@ -266,7 +266,7 @@ In [50]: %timeit x.ravel()
```
前面的示例是将 100 x 100 x 100 阵列整形为一个尺寸; 在这里,我们应用`numpy.flatten()``numpy.ravel()`这两个函数来折叠数组,同时我们还比较了执行时间。 我们注意到`numpy.flatten()``numpy.ravel()`之间的速度差异很大,但是它们都比三层 Python 循环快得多。 两种功能在性能上的差异是`np.flatten()`从原始数组创建副本,而`np.ravel()`只是更改视图(如果您不记得副本和视图之间的区别,请回到[第 2 章](../Text/2.html#K0RQ1-7febf188d2c44542a50efe01951015f9 "Chapter 2. The NumPy ndarray Object")*NumPy ndarray 对象* )。
前面的示例是将 100 x 100 x 100 阵列整形为一个尺寸; 在这里,我们应用`numpy.flatten()``numpy.ravel()`这两个函数来折叠数组,同时我们还比较了执行时间。 我们注意到`numpy.flatten()``numpy.ravel()`之间的速度差异很大,但是它们都比三层 Python 循环快得多。 两种功能在性能上的差异是`np.flatten()`从原始数组创建副本,而`np.ravel()`只是更改视图(如果您不记得副本和视图之间的区别,请回到第 2 章, “NumPy `ndarray`对象”)。
这个例子只是向您展示了 NumPy 提供了许多功能,其中一些可以产生相同的结果。 选择满足您目的的功能,同时为您提供优化的性能。
......@@ -318,7 +318,7 @@ Out[57]: array([0, 1, 2, 0, 1, 2, 0, 1])
# 布尔掩码
在 NumPy 中,索引和切片非常方便且功能强大,但是使用 boolean 掩码,效果会更好! 让我们首先创建一个布尔数组。 请注意,NumPy 中有一种特殊的数组,称为 *蒙版数组* 。 在这里,我们不讨论它,但是我们还将解释如何使用 NumPy 数组扩展索引和切片:
在 NumPy 中,索引和切片非常方便且功能强大,但是使用 boolean 掩码,效果会更好! 让我们首先创建一个布尔数组。 请注意,NumPy 中有一种特殊的数组,称为*蒙版数组*。 在这里,我们不讨论它,但是我们还将解释如何使用 NumPy 数组扩展索引和切片:
```py
In [58]: x = np.array([1,3,-1, 5, 7, -1])
......
......@@ -11,7 +11,7 @@
# 大步向前
跨步是 NumPy 数组中的索引方案,它指示要跳转以查找下一个元素的字节数。 我们都知道 NumPy 的性能改进来自具有固定大小项的同构多维数组对象`numpy.ndarray`对象。 我们已经讨论了`ndarray`对象的`shape`(维度),数据类型和顺序(C 风格的行主要索引数组和 Fortran 风格的列主要数组)。现在该讨论 仔细看看 **大步前进**
跨步是 NumPy 数组中的索引方案,它指示要跳转以查找下一个元素的字节数。 我们都知道 NumPy 的性能改进来自具有固定大小项的同构多维数组对象`numpy.ndarray`对象。 我们已经讨论了`ndarray`对象的`shape`(维度),数据类型和顺序(C 风格的行主要索引数组和 Fortran 风格的列主要数组)。现在该讨论 仔细看看**大步前进**
让我们首先创建一个 NumPy 数组并更改其形状以查看跨步的差异。
......@@ -65,7 +65,7 @@
```
4. 我们创建两个 NumPy 数组`x``y`并进行比较; 我们可以看到两个数组相等。 它们具有相同的形状,所有元素都是一个,但是实际上这两个数组在内存布局方面是不同的。 让我们简单地使用您在[第 2 章](../Text/2.html#K0RQ1-7febf188d2c44542a50efe01951015f9 "Chapter 2. The NumPy ndarray Object")*NumPy ndarray 对象* 中了解的 flags 属性来检查两个阵列的内存布局。
4. 我们创建两个 NumPy 数组`x``y`并进行比较; 我们可以看到两个数组相等。 它们具有相同的形状,所有元素都是一个,但是实际上这两个数组在内存布局方面是不同的。 让我们简单地使用您在第 2 章, “NumPy `ndarray`对象”中了解的 flags 属性来检查两个阵列的内存布局。
```py
In [17]: x.flags
......@@ -307,7 +307,7 @@ Out[56]:
```
我们可以看到带有`for`循环的`numpy.datetime64.tolist()``numpy.datetime64.item()`可以实现相同的目标,即将数组转换为 Python `datetime`对象的列表。 但是不用说,我们都知道哪种方法更适合进行转换(如果您不知道答案,请快速浏览[第 3 章](../Text/3.html#QMFO1-7febf188d2c44542a50efe01951015f9 "Chapter 3. Using NumPy Arrays")*使用 NumPy 数组* 。)另一方面,如果您已经有了 Python `datetime`的列表,并想将其转换为 NumPy `datetime64`数组,则只需使用`numpy.array()`函数。
我们可以看到带有`for`循环的`numpy.datetime64.tolist()``numpy.datetime64.item()`可以实现相同的目标,即将数组转换为 Python `datetime`对象的列表。 但是不用说,我们都知道哪种方法更适合进行转换(如果您不知道答案,请快速浏览第 3 章,“使用 Numpy 数组”。)另一方面,如果您已经有了 Python `datetime`的列表,并想将其转换为 NumPy `datetime64`数组,则只需使用`numpy.array()`函数。
## 文件 I / O 和 NumPy
......
......@@ -246,7 +246,7 @@ matrix([[ 0.2667],
# 分解
`numpy.linalg`提供了分解,在本节中,我们将介绍两种最常用的分解: **奇异值分解****svd** )和 **QR** 因式分解。 让我们首先计算 **特征值****特征向量** 。 在我们开始之前,如果您不熟悉特征值和特征向量,可以在 [https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors](https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors) 进行检查。 开始吧:
`numpy.linalg`提供了分解,在本节中,我们将介绍两种最常用的分解:**奇异值分解****svd** )和 **QR** 因式分解。 让我们首先计算**特征值****特征向量**。 在我们开始之前,如果您不熟悉特征值和特征向量,可以在 [https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors](https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors) 进行检查。 开始吧:
```py
In [41]: x = np.random.randint(0, 10, 9).reshape(3,3)
......@@ -313,7 +313,7 @@ Out[56]: array([ 13.5824, 2.8455, 2.3287])
```
在此示例中,`numpy.linalg.svd()`返回了三个元组数组,我们将其解压缩为三个变量:`u``sigma``vh`,其中`u`代表`A`的左奇异矢量( *AA-1* 的特征向量,`vh``A`的右奇异向量( *(A-1A)的特征向量)的逆矩阵 1* ),`sigma``A`的非零奇异值( *AA-1**的特征值 A-1A* )。 在该示例中,存在三个特征值,它们按顺序返回。 您可能会对结果感到怀疑,所以让我们做一些数学运算来验证它:
在此示例中,`numpy.linalg.svd()`返回了三个元组数组,我们将其解压缩为三个变量:`u``sigma``vh`,其中`u`代表`A`的左奇异矢量( *AA-1* 的特征向量,`vh``A`的右奇异向量(*(A-1A)的特征向量)的逆矩阵 1* ),`sigma``A`的非零奇异值( *AA-1**的特征值 A-1A* )。 在该示例中,存在三个特征值,它们按顺序返回。 您可能会对结果感到怀疑,所以让我们做一些数学运算来验证它:
```py
In [57]: diag_sigma = np.diag(sigma)
......@@ -349,7 +349,7 @@ array([[ 0.2667],
```
我们使用`numpy.linalg.qr()`分解`A`以获得`q``r`。 因此现在将原始方程式转换为 *(q * r)x = b* 。 我们可以使用`r``q``b`的逆矩阵乘法(点积)获得`x`。 由于`q`是一个 unit 矩阵,因此我们使用了转置而不是逆。 如您所见,结果`x`与我们使用矩阵和`numpy.linalg.solve()`时的结果相同; 这是解决线性问题的另一种方法。
我们使用`numpy.linalg.qr()`分解`A`以获得`q``r`。 因此现在将原始方程式转换为*(q * r)x = b* 。 我们可以使用`r``q``b`的逆矩阵乘法(点积)获得`x`。 由于`q`是一个 unit 矩阵,因此我们使用了转置而不是逆。 如您所见,结果`x`与我们使用矩阵和`numpy.linalg.solve()`时的结果相同; 这是解决线性问题的另一种方法。
### 注意
......@@ -380,7 +380,7 @@ Out[68]: array([ 4., 3., 2., 1.])
```
现在,假设我们有方程式 *y = x4-10 * 3 + 35 * 2-50x + 24* ,我们想知道 *的值 y**x = 5* 时。 我们可以使用`numpy.polyval()`来计算:
现在,假设我们有方程式 *y = x4-10 * 3 + 35 * 2-50x + 24* ,我们想知道*的值 y**x = 5* 时。 我们可以使用`numpy.polyval()`来计算:
```py
In [69]: np.polyval([1,-10,35,-50,24], 5)
......@@ -390,7 +390,7 @@ Out[69]: 24
`numpy.polyval()`具有两个输入参数,第一个是多项式的系数数组,第二个是用于评估给定多项式的特定点值。 我们也可以输入`x`的序列,结果将返回`ndarray`,其值对应于给定的`x`序列。
接下来我们将讨论 **积分****导数** 。 我们将继续以 *x <sup class="calibre26">4</sup> -10x <sup class="calibre26">3</sup> + 35x <sup class="calibre26">2</sup> -50x + 24* 的示例为例:
接下来我们将讨论**积分****导数**。 我们将继续以 *x <sup class="calibre26">4</sup> -10x <sup class="calibre26">3</sup> + 35x <sup class="calibre26">2</sup> -50x + 24* 的示例为例:
```py
In [70]: coef = np.array([1,-10,35,-50,24])
......
# 六、NumPy 中的傅立叶分析
除其他事项外,傅立叶分析通常用于数字信号处理。 这要归功于它在将输入信号(时域)分离为以离散频率(频域)起作用的分量方面如此强大。 开发了另一种快速算法来计算 **离散傅里叶变换****DFT** ),这就是众所周知的 **Fast 傅里叶变换** **FFT** ),它为分析及其应用提供了更多可能性。 NumPy 针对数字计算,也支持 FFT。 让我们尝试使用 NumPy 在应用程序上进行一些傅立叶分析! 注意,本章假定不熟悉信号处理或傅立叶方法。
除其他事项外,傅立叶分析通常用于数字信号处理。 这要归功于它在将输入信号(时域)分离为以离散频率(频域)起作用的分量方面如此强大。 开发了另一种快速算法来计算**离散傅里叶变换****DFT** ),这就是众所周知的 **Fast 傅里叶变换****FFT** ),它为分析及其应用提供了更多可能性。 NumPy 针对数字计算,也支持 FFT。 让我们尝试使用 NumPy 在应用程序上进行一些傅立叶分析! 注意,本章假定不熟悉信号处理或傅立叶方法。
本章将涉及的主题是:
......@@ -320,7 +320,7 @@ In [61]: plt.show()
![Fourier transform application](img/00029.jpeg)
首先,我们对`gray_img`使用二维傅立叶变换,并使用对数刻度色图绘制幅度谱。 我们可以看到,由于零频率分量,拐角有所不同。 请记住,当我们使用`numpy.fft.fft2()`时,该顺序遵循 *标准* 的顺序,并且我们希望将零频分量置于中心。 因此,让我们使用 shift 例程:
首先,我们对`gray_img`使用二维傅立叶变换,并使用对数刻度色图绘制幅度谱。 我们可以看到,由于零频率分量,拐角有所不同。 请记住,当我们使用`numpy.fft.fft2()`时,该顺序遵循*标准*的顺序,并且我们希望将零频分量置于中心。 因此,让我们使用 shift 例程:
```py
In [62]: fft_shift = np.fft.fftshift(fft)
......
# 七、构建和分发 NumPy 代码
在现实世界中,您将编写一个应用程序,以将其分发到 World 或在其他各种计算机上重用。 为此,您希望应用程序以标准方式打包,以便社区中的每个人都能理解和遵循。 正如您现在已经注意到的那样,Python 用户主要使用名为`pip`的程序包管理器来自动安装其他程序员创建的模块。 Python 具有一个称为 **PyPI****Python 软件包索引** )的打包平台,该平台是 50,000 多个 Python 软件包的官方中央存储库。 一旦在 PyPi(又名 *Cheese Shop* )中注册了软件包,世界各地的其他用户都可以在使用`pip`等软件包管理系统对其进行配置后进行安装。 Python 随附了许多解决方案,可帮助您构建代码以准备分发给 *Cheese Shop* ,并且在本章中,我们将重点介绍两个此类工具,`setuptools``Distutils` 除了这两个工具之外,我们还将研究 NumPy 提供的称为`numpy.distutils`的特定模块。 该模块使程序员更容易构建和分发特定于 NumPy 的代码。 该模块还提供了其他功能,例如用于编译 Fortran 代码,调用`f2py,`等的方法。 在本章中,我们将通过以下步骤来学习包装工作流程:
在现实世界中,您将编写一个应用程序,以将其分发到 World 或在其他各种计算机上重用。 为此,您希望应用程序以标准方式打包,以便社区中的每个人都能理解和遵循。 正如您现在已经注意到的那样,Python 用户主要使用名为`pip`的程序包管理器来自动安装其他程序员创建的模块。 Python 具有一个称为 **PyPI****Python 软件包索引**)的打包平台,该平台是 50,000 多个 Python 软件包的官方中央存储库。 一旦在 PyPi(又名 *Cheese Shop* )中注册了软件包,世界各地的其他用户都可以在使用`pip`等软件包管理系统对其进行配置后进行安装。 Python 随附了许多解决方案,可帮助您构建代码以准备分发给 *Cheese Shop* ,并且在本章中,我们将重点介绍两个此类工具,`setuptools``Distutils` 除了这两个工具之外,我们还将研究 NumPy 提供的称为`numpy.distutils`的特定模块。 该模块使程序员更容易构建和分发特定于 NumPy 的代码。 该模块还提供了其他功能,例如用于编译 Fortran 代码,调用`f2py,`等的方法。 在本章中,我们将通过以下步骤来学习包装工作流程:
* 我们将建立一个小的但可行的设置
* 我们将说明将 NumPy 模块集成到您的设置中的步骤
......@@ -103,7 +103,7 @@ setup(
现在,使用 **build** 选项运行`setup.py`应该不会给您任何错误,并生成带有`.egg-info`后缀的文件夹。 此时,您可以使用 **sdist** 选项运行`setup.py`,并创建一个可以与世界共享的软件包。
您应该看到最终消息为 **创建 tar 归档文件** ,如下所示:
您应该看到最终消息为**创建 tar 归档文件**,如下所示:
![Building the first working distribution](img/00032.jpeg)
......@@ -212,7 +212,7 @@ if __name__ == "__main__":
```
这里的`build_src`参数用于构造 Fortran 包装器扩展模块。 这里假定用户在其计算机上安装了 C / C ++和 Fortran 编译器。
这里的`build_src`参数用于构造 Fortran 包装器扩展模块。 这里假定用户在其计算机上安装了 C/C++ 和 Fortran 编译器。
# 测试您的包裹
......
......@@ -28,7 +28,7 @@ Cython 编程语言是 Python 的超集,用户仍然喜欢 Python 所提供的
# 设置 Cython
Cython 是一个将类型定义的 Python 代码转换为 C 代码的编译器,该代码仍在 Python 环境中运行。 最终输出是本机代码,其运行速度比 Python 生成的字节码快得多。 在大量使用循环的代码中,Python 代码加速的幅度更加明显。 为了编译 C 代码,首要条件是在计算机上安装 C / C ++编译器,例如`gcc`(Linux)或`mingw`(Windows)。
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](http://cython.org/#download) )下载 TAR 归档文件,然后 从此下载的`root`文件夹中运行以下命令:
......@@ -124,7 +124,7 @@ cmdclass={'build_ext': build_ext}
# 多线程代码
您的应用程序可能会使用多线程代码。 由于 **全局解释器锁** **GIL** ),Python 不适合多线程代码。 好消息是,在 Cython 中,您可以显式解锁 GIL,并使您的代码真正成为多线程。 只需在您的代码中放置一个`with nogil:`语句即可。 您以后可以在代码中使用`with gil`获取 GIL:
您的应用程序可能会使用多线程代码。 由于**全局解释器锁****GIL** ),Python 不适合多线程代码。 好消息是,在 Cython 中,您可以显式解锁 GIL,并使您的代码真正成为多线程。 只需在您的代码中放置一个`with nogil:`语句即可。 您以后可以在代码中使用`with gil`获取 GIL:
```py
with nogil:
......@@ -221,4 +221,4 @@ cmdclass={'build_ext': build_ext}
# 摘要
在本章中,我们了解了如何将 Python 代码隐蔽到 Cython 中。 我们还研究了一些涉及 NumPy 数组的示例 Python 代码。 我们简要介绍了 Python 语言中装箱和拆箱的概念以及它们如何影响代码性能。 我们还说明了如何显式解锁臭名昭著的 GIL。 为了进一步深入研究 Cython,我们建议 *学习 Cython 编程**Philip Herron**Packt Publishing* 。 在下一章中,您将了解 NumPy C API 以及如何使用它。
\ No newline at end of file
在本章中,我们了解了如何将 Python 代码隐蔽到 Cython 中。 我们还研究了一些涉及 NumPy 数组的示例 Python 代码。 我们简要介绍了 Python 语言中装箱和拆箱的概念以及它们如何影响代码性能。 我们还说明了如何显式解锁臭名昭著的 GIL。 为了进一步深入研究 Cython,我们建议*学习 Cython 编程**Philip Herron**Packt Publishing* 。 在下一章中,您将了解 NumPy C API 以及如何使用它。
\ No newline at end of file
......@@ -15,7 +15,7 @@ NumPy 是一个通用库,旨在满足科学应用程序开发人员的大多
我们使用的 Python 实现是 Python 解释器的基于 C 的实现。 NumPy 专用于此基于 C 的 Python 实现。 Python 的此实现带有 C-API,它是解释器的基础,并向其用户提供低级控制。 NumPy 通过提供丰富的 C-API 进一步增强了这一功能。
用 C / C ++编写函数可以为开发人员提供灵活性,以利用这些语言提供的一些高级库。 但是,就必须在解析输入周围编写太多样板代码以构造返回值而言,代价显而易见。 此外,开发人员在引用/解引用对象时必须格外小心,因为这最终可能会导致讨厌的错误和内存泄漏。 随着 C-API 的不断发展,还存在代码未来兼容性的问题。 因此,如果开发人员想要迁移到更高版本的 Python,则他们可能需要为这些基于 C-API 的扩展进行大量维护工作。 由于这些困难,大多数开发人员选择尝试其他优化技术。 (例如 Cython 或 F2PY),然后再探索这条路径。 但是,在某些情况下,您可能想重用 C / C ++中的其他现有库,这可能适合您的特定目的。 在这些情况下,最好为现有函数编写包装并公开 Python 项目。
用 C/C++ 编写函数可以为开发人员提供灵活性,以利用这些语言提供的一些高级库。 但是,就必须在解析输入周围编写太多样板代码以构造返回值而言,代价显而易见。 此外,开发人员在引用/解引用对象时必须格外小心,因为这最终可能会导致讨厌的错误和内存泄漏。 随着 C-API 的不断发展,还存在代码未来兼容性的问题。 因此,如果开发人员想要迁移到更高版本的 Python,则他们可能需要为这些基于 C-API 的扩展进行大量维护工作。 由于这些困难,大多数开发人员选择尝试其他优化技术。 (例如 Cython 或 F2PY),然后再探索这条路径。 但是,在某些情况下,您可能想重用 C/C++ 中的其他现有库,这可能适合您的特定目的。 在这些情况下,最好为现有函数编写包装并公开 Python 项目。
接下来,我们将看一些示例代码,并在本章继续介绍时解释其关键功能和宏。 此处提供的代码与 Python 2.X 版本兼容,可能不适用于 Python3.X。 但是,转换过程应该相似。
......@@ -62,7 +62,7 @@ Initialization Segment
```
`import_array()`的最终调用是特定于 NumPy 的函数,如果您的函数正在使用 Numpy Array 对象,则需要此函数。 这样可以确保加载 C-API,以便如果您的 C ++代码使用 C-API,则 API 表可用。 未能调用此函数和使用其他 NumPy API 函数将很可能导致分段错误错误。 建议您阅读 NumPy 文档中的`import_array()``import_ufunc()`
`import_array()`的最终调用是特定于 NumPy 的函数,如果您的函数正在使用 Numpy Array 对象,则需要此函数。 这样可以确保加载 C-API,以便如果您的 C++ 代码使用 C-API,则 API 表可用。 未能调用此函数和使用其他 NumPy API 函数将很可能导致分段错误错误。 建议您阅读 NumPy 文档中的`import_array()``import_ufunc()`
```py
/*
......@@ -217,7 +217,7 @@ return NULL;
```
看了前面的样板代码之后,我们终于来到了发生所有实际动作的部分。 那些熟悉 C ++的人会发现迭代方法与向量迭代相似。 我们之前定义的`in_iternext`函数在这里派上用场,用于迭代 Numpy 数组。 在 while 循环之后,我们确保在两个迭代器上都调用了`NpyIter_Deallocate`,在输出数组上调用了`Py_INCREF`; 未能调用这些函数是导致内存泄漏的最常见错误类型。 内存泄漏问题通常非常微妙,通常在具有长时间运行的代码(例如服务或守护程序)时才会出现。 要抓住这些问题,不幸的是,没有比使用调试器更深入的方法容易的方法了。 有时,只需要编写几个`printf`语句即可输出总内存使用情况:
看了前面的样板代码之后,我们终于来到了发生所有实际动作的部分。 那些熟悉 C++ 的人会发现迭代方法与向量迭代相似。 我们之前定义的`in_iternext`函数在这里派上用场,用于迭代 Numpy 数组。 在 while 循环之后,我们确保在两个迭代器上都调用了`NpyIter_Deallocate`,在输出数组上调用了`Py_INCREF`; 未能调用这些函数是导致内存泄漏的最常见错误类型。 内存泄漏问题通常非常微妙,通常在具有长时间运行的代码(例如服务或守护程序)时才会出现。 要抓住这些问题,不幸的是,没有比使用调试器更深入的方法容易的方法了。 有时,只需要编写几个`printf`语句即可输出总内存使用情况:
```py
/* iterate over the arrays */
......@@ -272,4 +272,4 @@ python setup.py build_ext -inplace
# 摘要
在本章中,我们向您介绍了另一种使用 Python 和 NumPy 提供的 C-API 优化或集成 C / C ++代码的方法。 我们解释了该代码的基本结构以及其他示例代码,开发人员必须编写这些代码才能创建扩展模块。 之后,我们创建了两个函数,这些函数计算出一个数字的平方,并将该平方函数从`math.h`库映射到一个 Numpy 数组。 这里的目的是使您熟悉如何利用 C / C ++编写的数字库,以最少的代码重写来创建自己的模块。 编写 C 代码的范围比这里描述的要广泛得多。 但是,我们希望本章使您有信心在需要时利用 C-API。
\ No newline at end of file
在本章中,我们向您介绍了另一种使用 Python 和 NumPy 提供的 C-API 优化或集成 C/C++ 代码的方法。 我们解释了该代码的基本结构以及其他示例代码,开发人员必须编写这些代码才能创建扩展模块。 之后,我们创建了两个函数,这些函数计算出一个数字的平方,并将该平方函数从`math.h`库映射到一个 Numpy 数组。 这里的目的是使您熟悉如何利用 C/C++ 编写的数字库,以最少的代码重写来创建自己的模块。 编写 C 代码的范围比这里描述的要广泛得多。 但是,我们希望本章使您有信心在需要时利用 C-API。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册