提交 c89ffb8c 编写于 作者: W wizardforcel

2020-07-24 19:32:18

上级 d7b88154
......@@ -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
......@@ -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`属性:
......
......@@ -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
......
......@@ -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`字段。 本练习将使用您从前面的章节中获得的所有知识。 让我们开始创建记录数组:
......
......@@ -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)
......
......@@ -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()`函数以提供它们之间的视觉比较。
......
......@@ -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
......
......@@ -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
......
# 九、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.
先完成此消息的编辑!
想要评论请 注册