From c707ce46db1466e23f3516a05bbf008acdef85f0 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Sun, 12 Nov 2017 11:27:29 +0800 Subject: [PATCH] ch4 --- 4.md | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) diff --git a/4.md b/4.md index 3c86829..5f00da0 100644 --- a/4.md +++ b/4.md @@ -1,5 +1,13 @@ # 四、数据类型 +> 原文:[Data Types](https://github.com/data-8/textbook/tree/gh-pages/chapters/04) + +> 译者:[飞龙](https://github.com/wizardforcel) + +> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) + +> 自豪地采用[谷歌翻译](https://translate.google.cn/) + 每个值都有一个类型,内建的`type`函数返回任何表达式的结果的类型: ```py @@ -162,3 +170,194 @@ sum(highs)/len(highs) 日高温的均值 +## 数组 + + +Python 中有很多种类的集合,我们在这门课中主要使用数组。 我们已经看到,`make_array`函数可以用来创建数值的数组。 + +数组也可以包含字符串或其他类型的值,但是单个数组只能包含单一类型的数据。 (无论如何,把不相似的数据组合在一起,通常都没有意义)。例如: + +```py +english_parts_of_speech = make_array("noun", "pronoun", "verb", "adverb", "adjective", "conjunction", "preposition", "interjection") +english_parts_of_speech +array(['noun', 'pronoun', 'verb', 'adverb', 'adjective', 'conjunction', + 'preposition', 'interjection'], + dtype=' 译者注: + +> ```py +> import numpy as np +> make_array = lambda *args: np.asarray(args) +> ``` + +返回到温度数据,我们创建 1850 年,1900 年,1950 年和 2000 年的几十年间,[日平均高温](http://berkeleyearth.lbl.gov/auto/Regional/TMAX/Text/global-land-TMAX-Trend.txt)的数组。 + +```py +baseline_high = 14.48 +highs = make_array(baseline_high - 0.880, + baseline_high - 0.093, + baseline_high + 0.105, + baseline_high + 0.684) +highs +array([ 13.6 , 14.387, 14.585, 15.164]) +``` + +数组可以用在算术表达式中来计算其内容。 当数组与单个数组合时,该数与数组的每个元素组合。 因此,我们可以通过编写熟悉的转换公式,将所有这些温度转换成华氏温度。 + +```py +(9/5) * highs + 32 +array([ 56.48 , 57.8966, 58.253 , 59.2952]) +``` + +数组也有方法,这些方法是操作数组值的函数。 数值集合的均值是其总和除以长度。 以下示例中的每对括号都是调用表达式的一部分;它调用一个无参函数来对数组`highs`进行计算。 + +```py +highs.size +4 +highs.sum() +57.736000000000004 +highs.mean() +14.434000000000001 +``` + +### 数组上的函数 + +`numpy`包,在程序中缩写为`np`,为 Python 程序员提供了创建和操作数组的,方便而强大的函数。 + +```py +import numpy as np +``` + +例如,`diff`函数计算数组中每两个相邻元素之间的差。 差数组的第一个元素是原数组的第二个元素减去第一个元素。 + +```py +np.diff(highs) +array([ 0.787, 0.198, 0.579]) +``` + +[完整的 Numpy 参考](http://docs.scipy.org/doc/numpy/reference/)详细列出了这些功能,但一个小的子集通常用于数据处理应用。 它们分组到了`np`中不同的包中。 学习这些词汇是学习 Python 语言的重要组成部分,因此在您处理示例和问题时,请经常回顾这个列表。 + +但是,你不需要记住这些,只需要将它用作参考。 + +每个这些函数接受数组作为参数,并返回单个值。 + + +| 函数 | 描述 | +| --- | --- | +| `np.prod` | 将所有元素相乘 | +| `np.sum` | 将所有元素相加 | +| `np.all` | 测试是否所有元素是真值 (非零数值是真值) | +| `np.any` | 测试是否任意元素是真值(非零数值是真值) | +| `np.count_nonzero` | 计算非零元素的数量 | + +每个这些函数接受字符串数组作为参数,并返回数组。 + + +| 函数 | 描述 | +| --- | --- | +| `np.char.lower` | 将每个元素变成小写 | +| `np.char.upper` | 将每个元素变成大写 | +| `np.char.strip` | 移除每个元素开头或末尾的空格 | +| `np.char.isalpha` | 每个元素是否只含有字母(没有数字或者符号) | +| `np.char.isnumeric` | 每个元素是否只含有数字(没有字母) | + +每个这些函数接受字符串数组和一个搜索字符串。 + + +| 函数 | 描述 | +| --- | --- | +| np.char.count | 在数组的元素中,计算搜索字符串的出现次数 | +| np.char.find | 在每个元素中,搜索字符串的首次出现位置 | +| np.char.rfind | 在每个元素中,搜索字符串的最后一次出现位置 | +| np.char.startswith | 每个字符串是否以搜索字符串起始 | + +## 范围 + +范围是一个数组,按照递增或递减的顺序排列,每个元素按照一定的间隔分开。 范围在很多情况下非常有用,所以值得了解它们。 + +范围使用`np.arange`函数来定义,该函数接受一个,两个或三个参数:起始值,终止值和“步长”。 + +如果将一个参数传递给`np.arange`,那么它将成为终止值,其中`start = 0`,`step = 1`。 两个参数提供了起始值和终止值,`step = 1`。 三个参数明确地提供了起始值,终止值和步长。 + +范围始终包含其`start`值,但不包括其`end`值。 它按照`step`计数,并在到达`end`之前停止。 + +```py +np.arange(end): An array starting with 0 of increasing consecutive integers, stopping before end. +np.arange(5) +array([0, 1, 2, 3, 4]) +``` + +要注意,数值从`0`起始,并仅仅增加到`4`,并不是`5`。 + +```py +np.arange(start, end): An array of consecutive increasing integers from start, stopping before end. +np.arange(3, 9) +array([3, 4, 5, 6, 7, 8]) +np.arange(start, end, step): A range with a difference of step between each pair of consecutive values, starting from start and stopping before end. +np.arange(3, 30, 5) +array([ 3, 8, 13, 18, 23, 28]) +``` + +这个数组从`3`起始,增加了步长`5`变成`8`,然后增加步长`5`变成`13`,以此类推。 + +当你指定步长时,起始值、终止值和步长可正可负,可以是整数也可以是分数。 + +```py +np.arange(1.5, -2, -0.5) +array([ 1.5, 1. , 0.5, 0. , -0.5, -1. , -1.5]) +``` + +### 示例:莱布尼茨的 π 公式 + +伟大的德国数学家和哲学家戈特弗里德·威廉·莱布尼茨(Gottfried Wilhelm Leibniz,1646 ~ 1716年)发现了一个简单分数的无穷和。 公式是: + +![](https://www.zhihu.com/equation?tex=%5Cpi%20%3D%204%20%5Ccdot%20%5Cleft(1%20-%20%5Cfrac%7B1%7D%7B3%7D%20%2B%20%5Cfrac%7B1%7D%7B5%7D%20-%20%5Cfrac%7B1%7D%7B7%7D%20%2B%20%5Cfrac%7B1%7D%7B9%7D%20-%20%5Cfrac%7B1%7D%7B11%7D%20%2B%20%5Cdots%5Cright)) + +虽然需要一些数学来确定它,但我们可以用数组来说服我们自己,公式是有效的。 让我们计算莱布尼茨的无穷和的前 5000 个项,看它是否接近 π。 + +![](https://www.zhihu.com/equation?tex=4%20%5Ccdot%20%5Cleft(1%20-%20%5Cfrac%7B1%7D%7B3%7D%20%2B%20%5Cfrac%7B1%7D%7B5%7D%20-%20%5Cfrac%7B1%7D%7B7%7D%20%2B%20%5Cfrac%7B1%7D%7B9%7D%20-%20%5Cfrac%7B1%7D%7B11%7D%20%2B%20%5Cdots%20-%20%5Cfrac%7B1%7D%7B9999%7D%20%5Cright)) + +我们将计算这个有限的总和,首先加上所有的正项,然后减去所有负项的和 [1]: + +![](https://www.zhihu.com/equation?tex=4%20%5Ccdot%20%5Cleft(%20%5Cleft(1%20%2B%20%5Cfrac%7B1%7D%7B5%7D%20%2B%20%5Cfrac%7B1%7D%7B9%7D%20%2B%20%5Cdots%20%2B%20%5Cfrac%7B1%7D%7B9997%7D%20%5Cright)%20-%20%5Cleft(%5Cfrac%7B1%7D%7B3%7D%20%2B%20%5Cfrac%7B1%7D%7B7%7D%20%2B%20%5Cfrac%7B1%7D%7B11%7D%20%2B%20%5Cdots%20%2B%20%5Cfrac%7B1%7D%7B9999%7D%20%5Cright)%20%5Cright)) + +> [1] 令人惊讶的是,当我们将无限多个分数相加时,顺序可能很重要。但是我们对 π 的近似只使用了大量的数量有限的分数,所以可以按照任何方便的顺序,将这些项相加。 + +和中的正项的分母是`1, 5, 9`,以此类推。数组`by_four_to_20`包含`17`之前的这些数。 + +```py +by_four_to_20 = np.arange(1, 20, 4) +by_four_to_20 +array([ 1, 5, 9, 13, 17]) +``` + +为了获得 π 的准确近似,我们使用更长的数组`positive_term_denominators`。 + +```py +positive_term_denominators = np.arange(1, 10000, 4) +positive_term_denominators +array([ 1, 5, 9, ..., 9989, 9993, 9997]) +``` + +我们实际打算加起来的正项,就是一除以这些分母。 + +```py +positive_terms = 1 / positive_term_denominators +``` + +负向的分母是`3, 7, 11`,以此类推。这个数组就是`positive_term_denominators`加二。 + +```py +negative_terms = 1 / (positive_term_denominators + 2) +``` + +整体的和是: + +```py +4 * ( sum(positive_terms) - sum(negative_terms) ) +3.1413926535917955 +``` + +这非常接近于`π = 3.14159...`。莱布尼茨公式看起来不错。 -- GitLab