numpy,pandas,matplotlib库的使用
前言:
Python三个常用库的学习笔记
一、numpy
1.1 数组创建
创建函数:array()
几个参数:
object:默认参数,输入一个列表,列表中又可以嵌套列表来表示多维数据
dtype:指定数据类型,可选,如果不指定则自动识别
order:指定存储方式,C-按行(先存储第一行的所有元素,然后是第二行的所有元素) F-按列(先存储第一列的所有元素,然后是第二列的所有元素,依此类推)
ndmin: 设置数组维度,一般嵌套有几层列表就是几维
1 | a = np.array([[1,2,3],[4,5,6]], |
运行结果:
array([[[1., 2., 3.],
[4., 5., 6.]]], dtype=float32)
打印数组形状
返回一个元组(行,列)
1 | a = np.array([[1,2,3],[4,5,6],[7,8,9]]) |
运行结果:
(3, 3)
填充数组:
zeros((行,列)):根据指定形状创建数组,元素默认以0填充
1 | a = np.zeros((3,3)) |
运行结果:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
ones((行,列)):根据指定的形状创建数组,元素默认以1填充
1 | a = np.ones((3,4)) |
运行结果:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
full((行,列),fill_value = 填充值):根据指定的形状创建数组,元素可以使用指定值填充
1 | a = np.full((3,3),fill_value=5) |
运行结果:
array([[5, 5, 5],
[5, 5, 5],
[5, 5, 5]])
arange(start,stop,step):根据参数创建一个一维的等差数组
1 | a = np.arange(0,10,2) |
linspace():生成一个等差数列的一维数组
start:起始值
stop:终止值
num:要分成的份数,默认是50
endpoint:默认为True,表示包含stop
每一份之间的间隔值:(stop - start)/num - 1
1 | a = np.linspace(0,10,21) |
运行结果:
[ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5 10. ]
1.2 数组属性
shape:
1.返回一个形状元祖
2.直接修改数组形状,数组的元素不能改变,既行×列=元素个数
1 | a = np.array([1,2,3,4,5,6,7,8,9,10,11,12]) |
运行结果:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
(12,)
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
(2, 6)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
(3, 4)
ndim:
返回数组维度数
1 | a = np.array([1,2,3,4,5,6,7,8,9,10,11,12]) |
运行结果:
1
1.3 数组索引
切片索引:
(行start:行stop:行step,列start:列stop:列step)stop是不包含的
numpy数组切片可以按行也可以按列
1 | a = np.array([[1,2,3],[4,5,6],[7,8,9]]) |
运行结果:
[1 4 7]
[1 4 7]
[1 2]
[[5 6]
[8 9]]
5
[[4 5 6]
[7 8 9]]
整数数组索引:
数组正常创建,在切片的时候a[[行索引],[列索引]],行索引和列索引组合成为坐标定位到数组元素
1 | a = np.array([[1, 2, 3], [4, 5, 6]]) |
运行结果:
整数数组索引的结果: [2 3 4]
布尔索引 :
使用条件表达式来访问满足条件的元素,二维数组布尔索引直接返回满足条件的一维数组
1 | a = np.array([[[1,2,3],[4,5,6]]]) |
运行结果:
[[[False False True]
[ True True True]]]
[3 4 5 6]
也可以再细化判断条件,例如索引第3个元素大于3的所有行
1 | print(arr[arr[:, 2] > 6]) |
索引第2行 值大于3 的所有的元素 所在的列
1 | print(arr[:, arr[1] > 5]) |
1.4 数组广播
目的:把两个不同形状的数组变成相同形状
手段:将数组的形状较小的数组复制到数组较大的数组的对应位置,使得它们具有相同的形状。
广播的前提:两个数组的维度相同,或者其中一个数组的维度为1。
维度:维度是指数组中元素的数量,数组的维度越高,数组中元素的数量就越多。
1 | import numpy as np |
运行结果:
(3, 1)
(3,)
[[11 21 31]
[12 22 32]
[13 23 33]]
[[11 12 13]
[21 22 23]
[31 32 33]]
1.5 数组遍历
for循环遍历:
二维数组直接使用for循环遍历,输出结果是每一个一维数组,有几维就要写几层for循环,效率不高
1 | a = np.array([[1, 2, 3], [4, 5, 6]]) |
运行结果:
[1 2 3]
[4 5 6]
nditer()函数
可以对数组进行迭代,并返回一个迭代器对象。
控制参数:
1.order:设置遍历数组的顺序,C-按行优先,F-按列优先。
1 | a = np.array([[1,2,3],[4,5,6]]) |
1 2 3 4 5 6 =====
1 4 2 5 3 6
flags([参数]):指定迭代器的额外行为
参数值:
multi_index:返回元素对应的下标索引元组(行,列)
external_loop:将遍历的单个元素添加到一个一维数组,遍历完成后输出一维数组
1 | a = np.array([[1,2,3],[4,5,6]]) |
[1 2 3 4 5 6]
1.6 数组运算
dot
一维数组点积
1 | a = np.array([1, 2, 3]) |
1×4+2×5+3×6 = 32
二维数组矩阵乘法
1 | a = np.array([[1, 2], [3, 4]]) |
[[19 22]
[43 50]]
matmul()
两个矩阵的乘法运算
1 | a = np.array([[1, 2], [3, 4],[9,10]]) |
[[ 19 22]
[ 43 50]
[115 134]]
np.linalg.det()
计算一个方阵的行列式
1 | a = np.array([[1, 2, 3], [4, 8, 6], [7, 8, 9]]) |
-36.0
1.7 数组操作
reshape((行,列)):修改数组形状
修改后返回一个新数组,不直接返回原数组
返回的新数组是原数组的一个视图,修改视图会影响原数组
reshape和shape的区别:reshape是改变数组的形状,shape是查看数组的形状
1 | a = np.array([1,2,3,4,5,6]) |
[[1 2 3]
[4 5 6]]
[100 2 3 4 5 6]
[[100 2 3]
[ 4 5 6]]
参数:
-1占位符:numpy会自动计算该占位符的维度
1 | a = np.array([1,2,3,4,5,6]) |
[1 2 3 4 5 6]
[[1 2]
[3 4]
[5 6]]
[[1 2]
[3 4]
[5 6]]
np.resize(arr,(x,y)):重塑数组形状,但是没有元素个数限制,直遍历原数组填充新数组直至填满新数组,剩下未遍历完的数组丢弃
1 | a = np.arange(1,13).reshape(3,4) |
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 1 2 3]
[ 4 5 6 7 8]
[ 9 10 11 12 1]
[ 2 3 4 5 6]]
np.expand_dims(arr,axis):根据指定的轴方向进行升维
axis = 0,按行升维,axis = 1,按列升维
1 | a = np.array([1,2,3]) |
[[1 2 3]]
(1, 3)
[[1]
[2]
[3]]
(3, 1)
多维数组扁平化
flat属性:返回一个一维数组迭代器,可以使用循环来遍历
1 | a = np.arange(1,13).reshape(3,4) |
1 2 3 4 5 6 7 8 9 10 11 12
flatten()方法:返回一个一维数组
浅拷贝,是原数组的副本,修改新数组不会影响原数组
1 | a = np.arange(1,13).reshape(3,4) |
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
ravel()方法:返回一个一维数组
深拷贝,是原数组的试图,修改新数组会影响原数组
1 | a = np.arange(1,13).reshape(3,4) |
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[[100 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
数组转置
1 | a = np.array([[1, 2, 3], [4, 5, 6]]) |
[[1 4]
[2 5]
[3 6]]
**squeeze(arr,axis):**根据指定的轴进行降维
降维前提:所在轴上的维度必须为1才能进行降维
axis按照轴方向进行降维,0-按最外层降维,1-按第二层降维,以此类推
假设数组为二维数组
axis = 0,按行降维
axis = 1,按列降维
axis = None,或不指定axis,对所有维度数为1的项降维
移除元素个数为1的维度
1 | a = np.array([[[[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],[16,17,18]]]]]) |
(1, 1, 2, 3, 3)
[[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]]
[[10 11 12]
[13 14 15]
[16 17 18]]]]
(1, 2, 3, 3)
[[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]]
[[10 11 12]
[13 14 15]
[16 17 18]]]]
(1, 2, 3, 3)
数组拼接stack
hstack(tuple):接收一个包含要连接元素的元组,横向连接,要求行数相同
1 | a = np.array([[1,2],[3,4]]) |
[[1 2 5]
[3 4 6]]
vstack(tuple):接收一个包含要连接元素的元组,纵向连接,要求列数相同
1 | a = np.array([[1,2,3],[4,5,6]]) |
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]]
数组切割split
hsplit(arr,[index]):水平切割数组
1 | a = np.arange(1,13).reshape(3,4) |
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[1]
[5]
[9]]
===========
[[ 2 3]
[ 6 7]
[10 11]]
===========
[[ 4]
[ 8]
[12]]
vsplit(arr,[index]):竖直切割数组
1 | a2 = np.vsplit(a,[1,2]) |
===========
[[1 2 3 4]]
===========
[[5 6 7 8]]
===========
[[ 9 10 11 12]]
append():在数组尾部添加值(可以是数组)
axis = None,添加后整合成一维数组输出
1 | a = np.array([[1,2,3],[4,5,6]]) |
axis = 0添加到行,维度必须保持一致
1 | a2 = np.append(a,[[1,1,8]],axis = 0) |
axis = 1添加到列,维度必须保持一致
1 | a3 = np.append(a,[[1,1,1],[4,5,6]],axis = 1) |
[1 2 3 4 5 6 1 1 1]
[[1 2 3]
[4 5 6]
[1 1 8]]
[[1 2 3 1 1 1]
[4 5 6 4 5 6]]
**insert()**指定位置添加值
axis = None,返回一维数组
axis = 0,插入行,自动广播
axis = 1,插入列,自动广播
1 | a = np.array([[1,2,3],[4,5,6]]) |
[1 6 2 3 4 5 6]
[[1 2 3]
[6 6 6]
[4 5 6]]
[[1 6 2 3]
[4 6 5 6]]
**delete():**删除指定位置的元素
参数和append类似
1 | a = np.arange(1,13).reshape(3,4) |
[ 1 3 4 5 6 7 8 9 10 11 12]
[[ 1 2 3 4]
[ 9 10 11 12]]
[[ 1 3 4]
[ 5 7 8]
[ 9 11 12]]
argwhere():默认返回非0元素的索引坐标,可自己设置条件
1 | a = np.array([[0,1,0,2],[0,2,0,3]]) |
[[0 1]
[0 3]
[1 1]
[1 3]]
where和argwhere功能一样,但是返回的是元组
(行索引下标数组,列索引下标数组)
可以整合布尔数组和索引数组,实现复杂的条件筛选
1 | a = np.array([[0,1,0,2],[0,2,0,3]]) |
(array([0, 0, 1, 1], dtype=int64), array([1, 3, 1, 3], dtype=int64))
(array([0, 1, 1], dtype=int64), array([3, 1, 3], dtype=int64))
[[9 1 9 2]
[9 2 9 3]]
argmax()获取数组中第一个最大值对应的下标索引
1 | a = np.array([[0,3,0,2],[0,2,0,3]]) |
[0 0 0 1]
**unique()函数:**返回数组中唯一的元素
参数:
arr:输入数组
return_index:如果为True,返回索引数组;否则,返回值数组。
return_inverse:如果为True,返回反向映射(反向映射:元素到其在数组中出现的索引)数组;否则,返回None。
return_counts:如果为True,返回每个元素的计数;否则,返回None。
1 | arr = np.array([1, 2, 3, 2, 4, 1, 5]) |
[1 2 3 4 5]
数组: [1 2 3 4 5]
索引: [0 1 2 4 6]
数组: [1 2 3 4 5] 反向映射: [0 1 2 1 3 0 4]
数组: [1 2 3 4 5] 计数: [2 2 1 1 1]
amin()和amax()函数
对于二维数组来说,
axis = 0表示沿着竖直的方向求最小值或最大值,
axis = 1表示沿着水平的方向求最小值或最大值。
axis = None表示沿着整个数组的方向求最小值或最大值。
1 | a = np.array([[0, 7, 3], [7, 9, 6], [4, 2, 9]]) |
[0 2 3]
[7 9 9]
0
ptp()计算峰值的差
1 | arr = np.array([[1,6,8],[0,9,4],[5,6,9]]) |
9
[5 3 5]
[7 9 4]
median()计算中位数
参数axis和ptp一样,都可以单独按行或者按列操作
中位数计算方法和数学一样(特殊情况取平均)
1 | # 中位数计算方法和数学一样(特殊情况取平均) |
4.0
[1. 6. 4.]
[1. 4. 6.]
mean()计算算术平均值
1 | arr = np.array([[1,2,0],[0,9,4],[5,6,9]]) |
4.0
[2. 5.66666667 4.33333333]
[1. 4.33333333 6.66666667]
average()加权平均值
1 | arr = np.array([1,2,6]) |
4.699999999999999
二维数组的加权平均值
axis=None表示沿着所有维度求平均值
axis=0表示沿着行方向求平均值,axis=1表示沿着列方向求平均值
weights的维度必须与数组arr的维度相同,且每一行的权重之和必须为1
1 | arr2 = np.array([[1,2,3],[4,5,6]]) |
3.8
[2.5 3. 4.8]
[2.2 5.4]
var()方差
1 | a1 = np.array([1, 2, 3, 4, 5,6]) |
2.9166666666666665
[2.25 2.25 2.25]
[0.66666667 0.66666667]
在样本数据中,样本均值的估计会引入一定的偏差。通过使用 n−1作为分母,可以校正这种偏差,得到更准确的总体方差估计。
1 | arr = np.array([1, 2, 3, 4, 5]) |
2.5
std()标准差
1 | a = np.array([1, 2, 3, 4, 5, 6]) |
1.707825127659933
[1.5 1.5 1.5]
[0.81649658 0.81649658]
二、matplotlib
2.1 画图操作
第一种绘图方式,直接使用plot()绘图
plot 绘制曲线函数
这是最简单的绘制方式,常用于简单的查看数据分布
1 | def test01(): |

下面是创建画布和子图的操作:
subplots()函数创建多个子图
1 | def test03(): |


2.2 绘制图表
柱状图bar()
1 | x = ["A","B","C","D"] |

直方图hist
1 | data = np.random.randn(1000) |

饼图ple()
1 | labels = ['A', 'B', 'C', 'D'] |

折线图plot
1 | x = np.linspace(0, 10, 100) |

散点图scatter()
1 | plt.rcParams['font.sans-serif'] = ['SimHei'] |

三、pandas库
3.1 series创建
创建Series对象
1 | s = pd.Series([1, 2, 3, 4, 5],dtype = "f8") |
指定索引和名称:
1 | # 创建Series对象,并指定索引 |
使用数组创建Series
1 | array_one = np.array(["xiaoming","xiaohuang","xiaozhang"]) |
3.2 Series遍历
切片
1 | s = pd.Series([1, 2, 3, 4, 5],index = ['a', 'b', 'c', 'd', 'e']) |
使用Series的index属性:
1 | s = pd.Series([1, 2, 3, 4, 5],index = ['a', 'b', 'c', 'd', 'e']) |
values属性:
1 | s = pd.Series([1, 2, 3, 4, 5],index = ['a', 'b', 'c', 'd', 'e']) |
3.3 dataframe创建
创建dataframe空对象
1 | df = pd.DataFrame() |
通过嵌套字典创建
1 | l = [{"name":"zhangsan","age":20},{"name":"lisi","age":"30","sex":"boy"}] |
字典嵌套Series创建,如果第二列比第一列多一个元素,自动用nan填充第一列
1 | dic = {"name":pd.Series([1,2,3],index = ["a","b","c"]), |
3.4 dataframe列操作
1 | dic = {"one":[1,2,3],"two":[4,5,6],"three":[7,8,9]} |
one two three
0 1 4 7
1 2 5 8
2 3 6 9
0 1
1 2
2 3
Name: one, dtype: int64
one two
0 1 4
1 2 5
2 3 6
添加空列:
1 | data = {"one":pd.Series(data = [1,2,3],index = ["a","b","c"]), |
添加一列空值:
1 | df["Three"] = None |
通过assign()添加一列,等号左边是要添加的列名,右边是对应的列值
assign()是链式调用
1 | df1 = df.assign(four = [40,50,60,70]).assign(five = [1,2,3,4]) |
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
one two Three
a 1.0 1 None
b 2.0 2 None
c 3.0 3 None
d NaN 4 None
one two Three four five
a 1.0 1 None 40 1
b 2.0 2 None 50 2
c 3.0 3 None 60 3
d NaN 4 None 70 4
insert()在指定位置插入数据
参数:loc-要插入的索引下标,column-要插入的列名,value-要插入的数据
1 | data = { |
修改数据
1 | data = { |
修改列名
1 | df.columns = ["col1","col2","col3"] |
修改列值(这里用了广播机制)
1 | df["col1"] += 100 |
rename()返回一个新的DataFrame对象,不修改原对象
columns参数可以传入一个字典,将原列名映射到新列名
1 | de1 = df.rename(columns={"col1":"col4","col2":"col5","col3":"col6"}) |
one two three
a 1 7 2
b 2 4 4
c 3 1 6
col1 col2 col3
a 1 7 2
b 2 4 4
c 3 1 6
col1 col2 col3
a 101 7 2
b 102 4 4
c 103 1 6
col4 col5 col6
a 101 7 2
b 102 4 4
c 103 1 6
修改数据类型
1 | data = { |
删除数据drop()
参数
labels:要删除的标签,可以是行,也可以是列
axis:轴方向,和labels结合使用
index:要删除的行标签或列标签列表
columns:要删除的列标签或列表
inplaces:如果为True表示原地删除数据,False则是返回一个新的dataframe
删除列 “two”,返回一个新的 DataFrame
1 | df1 = df.drop(labels="two", axis=1, inplace=False) |
删除索引 “a” 和 “b”,并删除列 “one”,直接在原 DataFrame 上修改
1 | df.drop(index=["a", "b"], columns=["one"], inplace=True) |
3.5 行操作
获取a行数据
1 | data = { |
对行切片,获取a行到b行的数据
1 | print(df.loc["a":"b"]) |
对行和列切片
1 | print(df.loc["a":"b","one":"two"]) |
定位获取一个标量
1 | print(df.loc["a","one"]) |
选择获取多行多列
1 | print(df.loc[["a","c"],["one","three"]]) |
iloc:根据索引选择数据
1 | data = { |
添加新行,只能有loc,不能用iloc
1 | data = { |
concat拼接dataframe
1 | data1 = { |
3.6 函数操作
1 | data = { |
reindex重置索引
1 | data = { |
原始 DataFrame:
A B C
0 1 10 100
1 2 20 200
2 3 30 300
3 4 40 400
4 5 50 500
使用 reindex 方法重置行索引后的 DataFrame:
A B C
b NaN NaN NaN
c NaN NaN NaN
d NaN NaN NaN
e NaN NaN NaN
f NaN NaN NaN