提交 725bd14d 编写于 作者: W wizardforcel

2020-07-24 17:53:44

上级 2dd4a888
......@@ -29,7 +29,7 @@ Figure 1: The SciPy stack, standard, and extended libraries
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 布局。 这将在以后的章节中详细讨论。
......
......@@ -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`功能解决此问题,如下所示:
......
......@@ -80,7 +80,7 @@ Out[20]: dtype('int32')
```
两个变量`x``y`完全相同:都是`numpy.int32`数组,范围从 *1**8* (如果使用 64 位计算机,则可能会得到`numpy.int64`)并除以`float 10.0`。 但是,当`x`除以浮点数时,将使用`dtype = numpy.float64`创建一个新的 NumPy 数组。 这是一个全新的数组,但是具有相同的变量名`x`,因此`x`中的`dtype`进行了更改。 另一方面,`y`使用`/=`符号,该符号始终沿用`y`数组的`dtype`值。 因此,当它除以`10.0`时,不会创建新的数组; 仅更改`y`元素中的值,但`dtype `仍为`numpy.int32`。 这就是`x``y`最终具有两个不同数组的原因。 请注意,从 1.10 版本开始,NumPy 不允许将浮点结果强制转换为整数。 因此,必须提高`TypeError`
两个变量`x``y`完全相同:都是`numpy.int32`数组,范围从`1``8`(如果使用 64 位计算机,则可能会得到`numpy.int64`)并除以`float 10.0`。 但是,当`x`除以浮点数时,将使用`dtype = numpy.float64`创建一个新的 NumPy 数组。 这是一个全新的数组,但是具有相同的变量名`x`,因此`x`中的`dtype`进行了更改。 另一方面,`y`使用`/=`符号,该符号始终沿用`y`数组的`dtype`值。 因此,当它除以`10.0`时,不会创建新的数组; 仅更改`y`元素中的值,但`dtype `仍为`numpy.int32`。 这就是`x``y`最终具有两个不同数组的原因。 请注意,从 1.10 版本开始,NumPy 不允许将浮点结果强制转换为整数。 因此,必须提高`TypeError`
# 通用功能(ufuncs)
......@@ -142,7 +142,7 @@ Out[31]: array([ 5., 6., 7., 8., 9.])
```
我们可以不使用`axis`参数就可以看到`numpy.median()`函数默认情况下会展平数组并返回中值元素,因此仅返回一个值。 使用`axis`自变量,如果将其应用于 0,则该操作将基于该列; 因此,我们获得了一个新的 NumPy 数组,其长度为 *3*`z`变量中总共有 *3*)。 虽然`axis = 1`,它基于行执行操作,所以我们有了一个包含五个元素的新数组。
我们可以不使用`axis`参数就可以看到`numpy.median()`函数默认情况下会展平数组并返回中值元素,因此仅返回一个值。 使用`axis`自变量,如果将其应用于 0,则该操作将基于该列; 因此,我们获得了一个新的 NumPy 数组,其长度为`3``z`变量中总共有`3`)。 虽然`axis = 1`,它基于行执行操作,所以我们有了一个包含五个元素的新数组。
ufuncs 不仅提供可选参数来调整操作,而且其中许多还具有一些内置方法,从而提供了更大的灵活性。 以下示例使用`numpy.add()`中的`accumulate()`累积对所有元素应用`add()`的结果:
......@@ -216,7 +216,7 @@ array([[ 1, 2, 3],
```
前面的示例向您展示`x``y`的广播方式。 `x`按列广播,而`y`按行广播,因为它们的形状在形状上均等于 *1*。 满足第二个广播条件,并且新结果数组是`3x3`
前面的示例向您展示`x``y`的广播方式。 `x`按列广播,而`y`按行广播,因为它们的形状在形状上均等于`1`。 满足第二个广播条件,并且新结果数组是`3x3`
![Broadcasting rules](img/00006.jpeg)
......@@ -232,7 +232,7 @@ ValueError: operands could not be broadcast together with shapes (3,3) (4)
```
在第三个示例中,由于`x``y`在行维度上具有不同的形状,并且它们都不等于 *1*,因此无法执行广播。 因此,不能满足任何广播条件。 NumPy 抛出`ValueError`,告诉您形状不兼容。
在第三个示例中,由于`x``y`在行维度上具有不同的形状,并且它们都不等于`1`,因此无法执行广播。 因此,不能满足任何广播条件。 NumPy 抛出`ValueError`,告诉您形状不兼容。
![Broadcasting rules](img/00007.jpeg)
......@@ -254,7 +254,7 @@ array([[[ 0, 1, 2, 3],
```
基本的重塑技术会更改`numpy.shape`属性。 在前面的示例中,我们有一个形状为`(24,1)`的数组,更改了 shape 属性后,我们获得了一个相同大小的数组,但是形状已更改为 *2**3**4* 组成。 注意, *-1* 的形状是指转移数组的剩余形状尺寸。
基本的重塑技术会更改`numpy.shape`属性。 在前面的示例中,我们有一个形状为`(24,1)`的数组,更改了 shape 属性后,我们获得了一个相同大小的数组,但是形状已更改为`2x3x4`组成。 注意, `-1`的形状是指转移数组的剩余形状尺寸。
```py
In [47]: x = np.arange(1000000)
......@@ -339,7 +339,7 @@ Out[62]: array([1, 3, 0, 5, 7, 0])
使用掩码,我们可以在不知道数组索引的情况下访问或替换数组中的任何元素值。 不用说,无需使用`for`循环即可完成此操作。
以下示例显示了如何对掩码数组求和,其中`True`代表 1,`False` 代表 0。我们创建了 50 个随机值,范围从 *0**1* ,其中 20 个大于 *0.5* ; 但是,对于随机数组,这是非常期望的:
以下示例显示了如何对掩码数组求和,其中`True`代表 1,`False` 代表 0。我们创建了 50 个随机值,范围从`0``1`,其中 20 个大于`0.5`; 但是,对于随机数组,这是非常期望的:
```py
In [69]: x = np.random.random(50)
......
......@@ -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`数组,所以让我们从一个简单的例子开始:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册