翻译:疯狂的技术宅
原文: https://towardsdatascience.co...
在 Python 中有许多数据类型。最多见的是float(浮点型),int(整型),str(字符串),bool(布尔),list 和 dict(字典)。python
'value'
、双引号 “value”
或三引号 """value"""
来定义字符串。三引号字符串能够用在多行文本上,还能够用于注释。能够用 type(variable_name)
函数来检查特定变量的类型。 Python 中的运算符根据变量的类型而表现不一样,每一个运算符都有不一样的内置方法。git
下面是在 Python 中建立浮点数、整数、字符串和布尔值变量的例子。api
year_of_birth = 1994 height_cm = 170.50 subject = "Data Science" is_success = True print(type(year_of_birth), type(height_cm), type(subject), type(is_success)) # 输出: <class 'int'> <class 'float'> <class 'str'> <class 'bool'>
Python 列表是一种基本的序列类型。咱们可使用此类型来存储值的集合。一个列表能够包含任何类型的值,同时一个列表也能够包含另外一个列表进行嵌套。你也能够建立一个混合使用 Python 类型的列表,不过这并不经常使用。可使用以下方法建立一个列表:数组
fruits = ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
能够用索引从列表中获取单个或多个元素。在Python中,索引从 0
开始。所以,列表中的第一个元素对应索引 0
。咱们还可使用负索引来访问元素,列表中的最后一个元素的索引为 -1
,倒数第二个元素的索引是 -2
,依此类推。咱们在Python中也有一个名为 切片 的东西,可用于从列表中获取多个元素。能够这样使用: sliceable[start_index:end_index:step]
。数据结构
start_index
是切片的起始索引,此索引所在的元素包含在结果中,默认值为 0
。end_index
是切片的结束索引,此索引处的元素不会被包含到结果当中,默认值将是列表的长度
。此外,若是 step
为负值,则默认值能够是 负的列表的长度 - 1
。若是跳过此步骤,你会获得从开始索引到结尾的全部元素。app
step
是索引增长的数量,默认值为 1
。若是把 step
设为负值,会从后向前移动。fruits = ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"] fruits[1] # apple fruits[0] # "pineapple" fruits[-1] # "kiwi" fruits[5] # "kiwi" fruits[-3] # "strawberry" # List slicing fruits[::] # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"] fruits[0:2] # ["pineapple", "apple"] fruits[-2:-1] # ["orange"] fruits[3:] # ["strawberry", "orange", "kiwi"] fruits[:4] # ["pineapple", "apple", "lemon", "strawberry"] fruits[:] # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"] fruits[::-1] # ["kiwi", "orange", "strawberry", "lemon", "apple", "pineapple"] fruits[::-2] # ["kiwi", "strawberry", "apple"] fruits[::2] # ["pineapple", "lemon", "orange"] # Understanding some default values fruits[0:6:1] # 与fruits[::]的结果相同 fruits[-1:-7:-1] # 与fruits[::-1]的结果相同
能够用 append
方法或 +
(加法运算符)将单个或多个元素添加到列表当中。若是你对两个列表使用加法运算符,Python 将给出两个列表合并后的新列表。机器学习
remove(value)
方法从列表中删除一个元素。此方法用参数传入的值删除列表中存储的第一个相同元素。# 添加一个元素 fruits.append("peach") fruits #输出 ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi", "peach"] fruits = fruits + ["fig", "melon"] fruits #输出 ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"] # 修改 fruits[0:2] = ["grape", "mango"] fruits #输出 ["grape", "mango", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"] # 从列表中删除 fruits.remove("mango") fruits #输出 ["grape", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]
了解列表背后的工做机制很是重要。当建立新列表 my_list
时,列表会存储在计算机内存中,该列表的地址被存储在 my_list
变量中。变量 my_list
不包含列表中的元素,它只包含对列表的引用。若是咱们用等号去复制一个列表时,好比 my_list_copy = my_list
,你复制的只是列表的引用而不是列表的值。因此若是要复制列表实际的值,能够用 list(my_list)
函数或切片 [ : ]
。函数
numbers = [10, 42, 28, 420] numbers_copy = numbers numbers_copy[2] = 100 numbers # [10, 42, 100, 420] numbers_copy # [10, 42, 100, 420] ratings = [4.5, 5.0, 3.5, 4.75, 4.00] ratings_copy = ratings[:] ratings_copy[0] = 2.0 ratings # [4.5, 5.0, 3.5, 4.75, 4.0] ratings_copy # [2.0, 5.0, 3.5, 4.75, 4.0] characters = ["A", "B", "C"] characters_copy = list(characters) characters_copy[-1] = "D" characters # ["A", "B", "C"] characters_copy # ["A", "B", "D"]
字典用于存储键值对形式的数据。当你但愿经过惟一键对值进行索引时颇有用。在 Python 中,可使用花括号建立字典,键和值由冒号分隔。若是想得到给定键的值,能够这样作:our_dict[key]
。学习
让咱们看一个例子,比较一下列表和词典。假若有一些电影,咱们想存储它们的评级,另外还但愿经过电影名称来很是快速地访问电影的评级。这时能够用两个列表或一个字典来完成这类操做。在例子中,movies.index(“Ex Machina”)
代码返回电影 “Ex Machina” 的索引。ui
使用列表
movies = ["Ex Machina", "Mad Max: Fury Road", "1408"] ratings = [7.7, 8.1, 6.8] movie_choice_index = movies.index("Ex Machina") print(ratings[movie_choice_index]) # 7.7
使用字典
ratings = { "Ex Machina": 7.7, "Mad Max: Fury Road": 8.1, "1408" : 6.8 } print(ratings["Ex Machina"]) # 7.7
能够看出,使用字典更加直观和方便。
能够对词典中的数据进行添加,更新和删除操做。当添加或更新数据时,能够简单地使用 our_dict[key] = value
,想要删除一个键值对时,能够用 del(our_dict[key])
操做。
ratings["Deadpool"] = 8.0 print(ratings) # {'Ex Machina': 7.7, 'Mad Max: Fury Road': 8.1, '1408': 6.8, 'Deadpool': 8.0} ratings["Ex Machina"] = 7.8 print(ratings) # {'Ex Machina': 7.8, 'Mad Max: Fury Road': 8.1, '1408': 6.8, 'Deadpool': 8.0} del(ratings["1408"]) print(ratings) # {'Ex Machina': 7.8, 'Mad Max: Fury Road': 8.1, 'Deadpool': 8.0}
还能够检查给定的键是否在字典中:key in our_dict
。
print("Ex Machina" in ratings) # True
函数是解决特定问题的可重用代码。能够用 def
关键字编写函数:
def is_prime(n): if n <= 1: return False elif n <= 3: return True elif n % 2 == 0 or n % 3 == 0: return False current_number = 5 while current_number * current_number <= n: if n % current_number == 0 or n % (current_number + 2) == 0: return False current_number = current_number + 6 return True
不过 Python 中有许多内置函数,例如 max( iterable[,key] )
,min( iterable [,key] )
,type( object )
,round( number[,ndigits] )
等。因此当咱们须要一个解决某个问题的函数时,能够先研究一下是否存在相关的内置函数或 Python 包。没有必要去“从新发明轮子”。
咱们已经知道 Python 中有字符串,浮点数,整数,布尔值等类型。这些数据结构都是一个对象。方法是一种可用于给定对象的函数,具体取决于对象的类型。因此每一个对象都有一个特定的类型和一组方法,具体形式取决于给出的类型。
# 字符串方法 text = "Data Science" text.upper() # "DATA SCIENCE" text.lower() # "data science" text.capitalize() # "Data science" # 列表方法 numbers = [1, 4, 0, 2, 9, 9, 10] numbers.reverse() print(numbers) # [10, 9, 9, 2, 0, 4, 1] numbers.sort() print(numbers) # [0, 1, 2, 4, 9, 9, 10] # 字典方法 ratings = { "Ex Machina": 7.7, "Mad Max: Fury Road": 8.1, "1408" : 6.8 } print(ratings.keys()) # dict_keys(['Ex Machina', 'Mad Max: Fury Road', '1408']) print(ratings.values()) # dict_values([7.7, 8.1, 6.8]) print(ratings.items()) # dict_items([('Ex Machina', 7.7), ('Mad Max: Fury Road', 8.1), ('1408', 6.8)])
不一样类型的对象能够有相同名称的方法。根据对象的类型,方法有各自不一样的行为。
numbers = [10, 30, 55, 40, 8, 30] text = "Data Science" numbers.index(8) # 4 text.index("a") # 1 numbers.count(30) # 2 text.count("i") # 1
务必要当心!某些方法能够更改调用它们的对象。例如在列表类型上调用append()
方法时。
模块是包含 Python 定义和声明的文件。用于定义解决特定问题的函数、方法和新的 Python 类型。
包是模块的集合。有许多 Python 包涵盖了不一样领域的解决方案。例如,NumPy、matplotlib、seaborn 和 scikit-learn 是很是着名的数据科学支持包。
默认状况下,Python 中有一些内置包,可是咱们还须要更多的包,这些默认是不安装的。若是想要使用某个软件包,它就必须是已经安装好的,或者先用 pip 安装( Python的包管理系统 )。
另外,还有一种叫作Anaconda 的东西。
Anaconda Distribution 是一个免费,易于安装的包管理器、环境管理器和 Python 发行版,其中包含1,000多个开源软件包,并提供免费的社区支持。
因此若是你不想安装太多的包,我建议你用 Anaconda。这个发行版中有不少有用的包。
安装所需的包后,能够把它们导入 Python 代码文件。能够从中导入整个包、子模块或特定函数。另外还能够为包设置别名。能够从下面的例子中看到 import 语句的不一样方式。
简单的导入
import numpy numbers = numpy.array([3, 4, 20, 15, 7, 19, 0])
导入的同时设置别名
import numpy as np # np 是 numpy 包的别名 numbers = np.array([3, 4, 20, 15, 7, 19, 0]) # 工做正常 numbers = numpy.array([3, 4, 20, 15, 7, 19, 0]) # 出错,NameError: name 'numpy' is not defined
从包导入子模块并设置别名
# 从 matplotlib 包中导入 pyplot 子模块并设置别名 "plt" import matplotlib.pyplot as plt
仅从包中导入一个函数
from numpy import array numbers = array([3, 4, 20, 15, 7, 19, 0]) # 工做正常 numbers = numpy.array([3, 4, 20, 15, 7, 19, 0]) # 出错,NameError: name 'numpy' is not defined type(numbers) # 输出:numpy.ndarray
咱们也能够这样导入: from numpy import *
。星号表示从该模块导入全部内容。这条 import 语句会在当前命名空间中为 numpy
模块定义的全部公共对象建立引用。换句话说,咱们可使用 numpy
中的全部可用函数,在函数名称能够不带前缀。例如,如今咱们能够这样使用 NumPy 的绝对值函数: absolute()
,而不是numpy.absolute()
。
可是,我不建议你使用它,由于:
NumPy 是用 Python 进行科学计算的基础包。它很是快速且易于使用。这个包可以帮助咱们按元素进行计算(逐个元素)。
常规的 Python 列表不知道如何以元素方式进行操做。固然咱们也能够用 Python 列表去作科学计算,可是它很是慢,并且还须要编写更多的代码来获得想要的结果。更多时候使用 NumPy 才是一个聪明的主意。
与常规 Python 列表不一样,NumPy 数组中的元素老是只有一种类型。若是咱们将一个不一样类型的数组传递给np.array()
,能够用参数 dtype
设定想要的类型。若是没有给出此参数,则会将类型肯定为保存对象所需的最小类型。
NumPy 数组 —— 类型转换
np.array([False, 42, "Data Science"]) # array(["False", "42", "Data Science"], dtype="<U12") np.array([False, 42], dtype = int) # array([ 0, 42]) np.array([False, 42, 53.99], dtype = float) # array([ 0. , 42. , 53.99]) # 无效的类型转换 np.array([False, 42, "Data Science"], dtype = float) # 不会把字符串 'Data Science' 转化为浮点型
NumPy 数组有本身的属性和方法。你是否是还记得前面说过 Python 运算符在不一样的数据类型上表现也不同?在NumPy 中运算符在这方面表现得很好。
NumPy 数组上的运算符
np.array([37, 48, 50]) + 1 # array([38, 49, 51]) np.array([20, 30, 40]) * 2 # array([40, 60, 80]) np.array([42, 10, 60]) / 2 # array([ 21., 5., 30.]) np.array([1, 2, 3]) * np.array([10, 20, 30]) # array([10, 40, 90]) np.array([1, 2, 3]) - np.array([10, 20, 30]) # array([ -9, -18, -27])
若是检查 NumPy 数组的类型,结果会是 numpy.ndarray
。 ndarray 意味着是 n 维数组。在前面的例子中用了一维数组,可是也可使用 2, 3, 4 甚至更多维数组。咱们能够在数组上进行子集化,而这与该数组的维数无关。下面是一些二维数组的例子。
二维数组的子集
numbers = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ]) numbers[2, 1] # 8 numbers[-1, 0] # 10 numbers[0] # array([1, 2, 3]) numbers[:, 0] # array([ 1, 4, 7, 10]) numbers[0:3, 2] # array([3, 6, 9]) numbers[1:3, 1:3] # array([[5, 6],[8, 9]])
若是想要知道一个 numpy 数组有多少个维度,以及每一个维度有多少个元素,能够用 shape
属性。下面的代码获得二维数组的shape,返回的元组中的第一个元素是行数,第二个元素是列数。
NumPy 的 shape
属性
numbers = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15] ]) numbers.shape # (5, 3)
分析数据的第一步是熟悉数据。 NumPy 有一些基本方法来帮助咱们作到这一点。
np.mean()
- 返回算术平均值(元素之和除以元素的个数)。np.median()
- 返回中位数(传入的数组的中间值,若是数组的长度是偶数,将计算两个中间值的平均值)np.corrcoef()
- 返回一个相关矩阵。当咱们想要查看数据集中两个变量之间是否存在相关性时,或者在两个具备相同长度的数组之间存在相关性时,这个函数很是有用。np.std()
- 返回标准误差learning_hours = [1, 2, 6, 4, 10] grades = [3, 4, 6, 5, 6] np.mean(learning_hours) # 4.6 np.median(learning_hours) # 4.0 np.std(learning_hours) # 3.2 np.corrcoef(learning_hours, grades) # 输出:[[ 1. 0.88964891][ 0.88964891 1. ]]
使用 NumPy 生成基本统计信息
从上面的例子中,咱们能够看到学习时间和成绩之间存在高度相关性。
此外还能够看到:
NumPy 还有一些基本函数,如 np.sort()
和 np.sum()
,在基本的 Python 列表中也有一样的函数。不过须要注意的是 NumPy 在数组中会强制统一类型,这加快了计算速度。