概述
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。
可以用type(A)来判断A的数据类型。
Python3标准数据类型
Python3有6个标准数据类型,分别为:
Number(数字)String(字符串)List(列表)Tuple(元组)Set(集合)Dictionary(字典)
其中,不可变数据3个:Number、String、Tuple;可变数据3个:List、Dictionary、Set。(不可变数据和可变数据区别?)
Number 数字
支持int、float、bool和complex(复数)四种类型。
int为整数的唯一类型,表示为长整型,包括正整数、0和负整数。可以采用不同进制表示整数,二进制数以0b或0B开头,八进制数以0o或0O开头,十六进制数以0x或0X开头。书写时可以用下划线“_”作为数字的分隔符,例如
y = 2_600_000
print(y)
结果:2600000
float为浮点数唯一类型,书写时必须包含一个小数点,否则会被当做整数处理,例如
x = 2.
print(type(x))
结果:<class 'float'>
小数还可以用科学计数法书写,使用这种方法书写的数即使最终值为整数,数据类型也是小数。例如:
2.1E5 = 2.1×105,其中 2.1 是尾数,5 是指数。
14E3 等价于 14000,但 14E3 是一个小数。
由于小数在内存中以二进制形式存储,转换时可能是无限循环数字,因此小数计算结果一般不精确。
bool型用数字0表示False,数字1表示True。把True和False定义成关键字,可以直接使用,但它们的值还是1和0,可以进行运算。例如:
k = True
f = False
print(k+f+8)
结果:9
complex型为复数,复数由实数部分和虚数部分组成,可以用a+bj或complex(a,b)表示。复数的实部a和虚部b都是浮点型。
String 字符串
Python中字符串用单引号‘或双引号“括起来,同时用反斜杠\转义特殊字符。如\n表示分行,如果不想转义,可以在字符串前面添加一个r,表示原始字符串。
可以用a[]选取字符串a中的部分值,用来实现截取、拼接或更新字符串等功能。三引号'''可以实现字符串跨行。
字符串相关函数见菜鸟教程字符串部分。
字符串和int、float、bool转换可以用str()\ int()\ float()\ bool()等函数实现。
List 列表
列表是一个有序的集合,可以随时添加和删除其中的元素。每个元素都分配对应的索引,第一个索引是0,以此类推。定义一个空的列表可以使用下面的语句:
L = []
列表可以采用方括号+索引[ ]、[ : ]的形式选取其中一个或部分元素。
常用内置函数由len()返回列表长度、max()/min()返回最大最小值等。常用内置方法由append(obj)尾部添加一个元素、pop(index=-1)删除一个元素(默认尾部)、copy()复制列表等,详见菜鸟教程。
Tuple 元组
元组与列表类似,是一个有序的集合,但是一旦初始化后就不能修改。定义一个空的元组语句如下:
L = ()
Dictionary 字典
字典是一种散列表。散列表又称哈希表,是一种无序的存储结构(dict内部存放顺序与key放入顺序不同)。与顺序存储结构(如列表)按照索引顺序一个个访问元素不同,散列表能够通过输入关键字(key),经过哈希算法的变换,直接访问到对应值(value)。使用这种方式存储,可以大大加快查询速度,但是内存消耗也会大幅增加,这是一种用空间换时间的存储结构。
字典由键值对组成,键和值用冒号:分割。定义一个空字典语句如下:
L = {}
访问字典中某个值,需要把相应的键放到方括号中,如:
dict['name']
字典的键不允许出现两次,如果同时出现两次,字典会记住最后一个对应的value。
字典的键必须是不可变的。因为字典需要对键通过哈希函数映射到对应的值,如果键发生变化,就无法对应到正确的值。因此键可以是数字、字符串和元组,而不能是其它形式。
Set 集合
集合与字典类似,是一个无序的储存不重复元素的序列。但是集合之储存key,不储存value。可以用大括号{}或set()创建集合,但是创建空集合只能用如下方法:
L = set()
集合的常用内置方法有add()添加元素、update()更新元素、remove()移除元素等。详见菜鸟教程。
由于集合存储不重复元素这个特性,常常应用在集合运算中。
Numpy数据结构:ndarray 多维数组
Numpy的主要功能是处理多维数组。Python标准数据类型List可以处理数组,主要对象是一维数组,处理多维数组比较麻烦。Numpy正好弥补了这个缺陷。因此涉及到矩阵运算的工作,直接调用Numpy包处理就好了!
Numpy数据类型
与Python内置数据类型不同,numpy支持更多种类数据类型。仅以int为例,Python内置只有一种类型,而numpy则细分为int8、int16、int32、int64等多种数据类型,分别对应不同的长度。导入numpy包后可以通过dtype指定这些更细化的数据类型。例:
import numpy as np
d = np.dtype(np.int8)
使用ndarray数据结构可以直接对参数dtype指定需要的数据类型。
创建多维数组
创建ndarray数组有多种方法,还可以通过调用函数实现创建特殊数组。最常用的创建数组语句是:
a = np.array([1, 2, 3], dtype=np.int32) #支持指定数据类型dtype,可选
b = np.array([[1, 2, 3], [4, 5, 6]]) #创建二维数组
除了上面这种方法之外,还可以创建一些特殊数组:
a = np.empty(shape=[3, 2], dtype=None, order='C') #创建一个3行2列的数组,元素随机
b = np.zeros(shape=[3, 2]) #创建一个3行2列的数组,元素全部为0
c = np.ones(6) #创建一个1行6列的数组,元素全部为1
d = np.identify(5) #创建一个5阶单位矩阵
e = np.arange(start, stop, step, dtype) #以start为起始值,end为终止值(不包括),步长为step,创建数值连续数组
f = np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) #以base为底,start和stop为起始幂和终止幂(endpoint=True时包含终止幂),创建等比数列,共num个元素。
ndarray数组属性
ndarray.ndim为数组的秩,即矩阵的维度,例如:
a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
print(a.ndim)
结果:2 (a是一个3*3的二维矩阵,因此输出结果为2)
ndarray.shape为数组的维度,对于上例数组a来说,a.shape输出结果应为i(3, 3)
ndarray.item为数组的大小,即元素个数。a.item输出结果应为9
数组的变形、切片和索引
使用ndarray.reshape()可以变换数组的维度。例如:
a = np.arange(20)
a.reshape(4, 5)
这就把一个1行20列的一维数组变换成了4行5列的二维数组。
有的时候要取现有数组的一部分,这就涉及到数组的切片和索引。数组的索引是数组中每个元素对应的数字标志,从0开始。可以通过方括号[]、冒号:和索引的方法实现对数组中部分元素的选取,进而实现切片功能。冒号 : 的解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。例如:
a = np.arange(10)
a[2:]表示选取a中第三个和之后所有的元素
a = np.arange(9).reshape(3, 3)
a[1:]表示选取从第二行开始全部元素(即第二行和第三行全部元素),也可以表示为a[1:, ...]
a[...,1:]表示选取从第二列开始全部元素
a[1:, 1:]表示选取第二行第三行和第二列第三列的交集所有元素
a[1:, [1, 2]]在本例中含义a[1:, 1:]相同
还可以使用布尔索引完成特定元素的筛选:
a = np.arange(9).reshape(3, 3)
print(a[a > 5])
结果:[6 7 8]
a = np.array(np.nan, 1, 2, np.nan, 3, 4, 5)
print(a[~is.nan(a)]) #“~”符号为取补运算符,可以理解为逻辑中的“非”,本例中含义为筛选出非nan的元素。
结果:[ 1. 2. 3. 4. 5.]
数组元素相关数学及统计运算
numpy.around(a,decimals)可以对数组a中元素进行四舍五入操作。decimals参数决定了精度,默认为0,即精确到个位。decimals为正数为精确到小数点后,负数为精确到小数点前。例如:
a = np.array([1.0,5.55, 123, 0.567, 25.532])
print (np.around(a))
print (np.around(a, decimals = 1))
print (np.around(a, decimals = -1))
结果:[ 1. 6. 123. 1. 26.]
[ 1. 5.6 123. 0.6 25.5]
[ 0. 10. 120. 0. 30.]
numpy还是支持对数组进行向下取整/向上取整操作:
np.floor(a) #向下取整
np.ceil(a) #向上取整
可以对数组进行简单的加减乘除操作,与矩阵运算不同,这里是对数组的对应元素进行运算操作。进行操作的数组要求形状相同或其中一个可以通过复制(行或列)与另一个形状相同。
np.add(a, b)
np.subtract(a, b)
np.multiply(a, b)
np.divide(a, b)
除了上面介绍的功能,numpy还支持数组取倒数、取幂、取余数等操作。统计运算上支持极值(a.max()/a.min())、极差、百分位数、中位数、平均数(算术和加权)。注意numpy中没有直接计算数组众数的函数。详见菜鸟教程。
其它数据类型转换为ndarray
从已有数据类型中转换为ndarray,可以使用下面的方法:
np.asarray(a)
Pandas数据结构:Series和DataFrame
Pandas是基于NumPy开发,目前最强大的数据分析支持库了。它有两种数据类型,Series和DatFrame。
Series 一维标签数据结构
Series是带标签的一维数组,这里的标签指的是数据的索引,也是pandas数据结构与其它数据结构的显著不同之处之一。其它数据结构例如Python自带的list、NumPy的array等也有索引,Series与之不同的是,1)Series的索引被直观地对齐标注在数据旁;2)Series支持自定义索引名称,赋予数组的轴以实际意义。如下例子:
c = pd.Series(data=np.arange(6), index=['a', 'b', 'c', 'd', 'e', 'f'])
print(c)
结果:
a 0
b 1
c 2
d 3
e 4
f 5
Series的创建
最简单的方法是通过pd.Series()方法创建,注意S必须大写。与NumPy类似,可以使用dtype参数指定数据类型。
还可以从字典dict创建Series,如下:
a = {'a':1, 'b':2, 'c':3, 'd':4}
b = pd.Series(a)
Series的属性
Series的一个重要属性是name,可以在创建时使用name=参数指定名称。Series会自动为数组分配名称,尤其是从DataFrame切片下来时。可以使用pd.Series.rename()为数组重命名。
Series的切片
与NumPy类似,Series可以使用中括号[]、冒号:和数字索引的方式选取数组中数据。具体参考前文。
使用指定的特殊索引选取数据时,可以用下面的方法:
print(c[['a', 'd']])
DataFrame 二维标签数据结构
DataFrame可以看作Series按列合并而成的二维数据结构。这里标签的含义是索引,具体参考Series这部分介绍。
参考资料
菜鸟教程 https://www.runoob.com/python3/ https://www.runoob.com/numpy/
http://c.biancheng.net/view/7040.html
廖雪峰的Python教程 https://www.liaoxuefeng.com/wiki/1016959663602400
NumPy中文网 https://www.numpy.org.cn/
Pandas中文网 https://www.pypandas.cn/docs/