Python3及拓展包基本数据结构特点、使用方法和转换方法

概述

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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342