声明,内容严重借鉴https://blog.youkuaiyun.com/weixin_43598956/article/details/106585342
撰写此文目的有二:记录知识点以及练习markdown撰写博客,请各位尊重原创支持原文↑↑↑
Matplotlib & NumPy学习笔记
Matplotlib部分
常用统计图比较
折线图
- 以折线图的上升或下降来表示统计数量的增减变化的统计图
- 特点:能够显示数据的变化趋势,反应事物的变化情况
直方图
- 由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般横轴表示数据范围,纵轴
- 表示分布情况
- 特点:绘制连续性的数据,展示一组或者多组数据的分布情况
条形图
- 排列在工作表的列或行中的数据可以绘制到条形图中
- 特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别
散点图
- 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总
- 结坐标
- 特点:判断变量之间是否存在数量关联趋势,展示离群点
Matplotlib基本要点
from matplotlib import pyplot as plt
x = range(2,26,2) #数据在X轴的位置,步长为2,是一个可迭代对象
y = [15,12,16,18,21,26,30,18,10,2,7,33] #数据在Y轴的位置,是一个可迭代对象X轴和Y轴的数据一起组成了所有要绘制的坐标,分别为(2,15),(4,12),(6,16)。。。
plt.plot(x,y) #传入x和一,通过plot绘制出折线图
plt.show() #展示图形
图片:
1).设置图片的大小
plt.figure(figsize(a,b),dpi=c)
- figsize(a,b):图片的长和宽
- dpi:每英寸像素点的个数
plt.figure(figsize=(12,7),dpi=100) # 创建一个 12 * 7 点(point)的图,并设置分辨率为 100
2).保存图片
plt.savefig("file_path")
位置需要放在plot.plot()之后
plt.savefig("./t1.png") #保存图片到指定位置,保存为svg这种矢量图格式,放大后就不会又锯齿
3).设置x,y轴上的刻度及字符串
plt.xticks(x,rotation=45,fontproperties=my_font)
传一个参数:包含数字的可迭代对象,步长合适即可
传入两个参数:分别为两个可迭代对象,数字型和字符型最终会一一对应,只显示字符串
- rotation:旋转角度
- fontproperties:中文显示
plt.yticks(y)
例如:
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
#取步长,数字和字符串一一对应,数据的长度一样
plt.xticks(list(x)[::3],_xtick_labels[::3],rotation = 45,fontproperties=my_font)
#若要X轴刻度变稀疏点,可用列表取步长(X[::3])来解决,旋转角度为45度,my_font为自己设置的字体样式
4).设置中文显示
font_manager.FontProperties(fname=" ")
例如:
from matplotlib import font_manager #第一步:导入font_manager
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
5).添加x,y轴以及titile描述信息
plt.xlabel(" ")
plt.ylabel(" ")
plt.title(" ")
例如:
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度 单位(℃)",fontproperties=my_font)
plt.title("10点到12点每分钟的气温变化情况",fontproperties=my_font)
6).绘制网格
plt.grid(alpha = 0.2)
- alpha:透明度
7).添加图例
plt.legend()
例如:
x = range(1,50,3)
x_2 = range(3,60,2)
y_1 = [1,3,78,9,30,84,7,48,99,27,83,72]
y_2 = [3,8,90,37,82,93,84,26,84,67,29,76]
from matplotlib import pyplot as plt
plt.plot(x,y_1,label = "自己") #在一个图上绘制多个图形(多次plt.plot()即可)
plt.plot(x,y_2,label = "朋友") #第一步:分别添加label
plt.legend(prop = my_font) #第二步:添加图例,若为中文字体需要用到prop
图片:
8).绘图
-
plt.plot(x,y,color='r',linestyle="--",linewidth=5,alpha=0.5)#绘制折线图
- x:所有坐标的x的值
- y:所有的坐标y的值
- color:线条的颜色
- linestyle:线条风格
- linewidth:线条粗细
- alpha
-
plt.scatter(x,y) #绘制散点图
-
plt.bar(x,y) #绘制竖条形图
-
plt.harh(x,y) #绘制横条形图
-
plt.hist(x,num_bins) #绘制直方图
- num_bins:设置的组距
实例1:用折线图绘制10到12点每一分钟的气温变化情况
from matplotlib import pyplot as plt #导入pyplot
import random
from matplotlib import font_manager #导入font_manager
plt.figure(figsize=(10,8),dpi=100) #设置图片大小及分辨率
my_font = font_manager.FontProperties(fname="c:\Windows\Fonts\msyh.ttc") #设置字体
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
#绘制折线图
plt.plot(x,y)
#调整x轴的刻度
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)] ##这里好像不太懂###############################
#想要x轴刻度稀疏一点,则可对列表取步长操作,数字和字符串一一对应,数据的长度一样,旋转度数
plt.xticks(list(x)[::3],_xtick_labels[::3],rotation = 45,fontproperties=my_font)
#添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度 单位(℃)",fontproperties=my_font)
plt.title("10点到12点每分钟的气温变化情况",fontproperties=my_font)
#缓存图片
plt.savefig("./t1.png")
#展示图片
plt.show()
截图:
实例2:绘制折线图2
from matplotlib import pyplot as plt
from matplotlib import font_manager
plt.figure(figsize=(10,8),dpi=100)
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
x = range(11,31)
y_1 = [3,2,4,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_2 = [3,5,1,1,5,0,2,7,1,3,5,6,6,2,1,2,1,0,4,5]
plt.plot(x,y_1,label = "小弟")
plt.plot(x,y_2,label = "大哥")
#调整x轴的刻度
_xtick_labels = ["{}号".format(i) for i in range(11,31)]
#############这里x轴刻度分布合适不取步长,则不用转为列表形式,数字和字符串一一对应,数据的长度一样,旋转45度
plt.xticks(x,_xtick_labels,rotation = 45,fontproperties=my_font)
#添加描述信息
plt.xlabel("几号",fontproperties=my_font)
plt.ylabel("零食量 单位(包)",fontproperties=my_font)
plt.title("11-30号每天吃零食包数情况走势",fontproperties=my_font)
#添加图列
plt.legend(prop = my_font)
#绘制网络
plt.grid(alpha = 0.2)
#展示
plt.show()
截图:
实例3.绘制散点图
from matplotlib import pyplot as plt
from matplotlib import font_manager
#设置图形大小
plt.figure(figsize=(12,7),dpi = 100)
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
x_5 = range(1,32)
x_6 = range(51,82)
y_5 = [21,19,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,12]
y_6 = [13,14,28,19,24,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,19,7]
#绘制散点图,及图例
plt.scatter(x_5,y_5,label = "5月份")
plt.scatter(x_6,y_6,label = "6月份")
#设置x轴的刻度
_x = list(x_5) + list(x_6)
_xticks_labels = ["5月{}日".format(i) for i in x_5]
_xticks_labels += ["6月{}日".format(i) for i in x_6]
plt.xticks(_x[::3],_xticks_labels[::3],rotation = 45,fontproperties=my_font)
#添加图例
plt.legend(prop = my_font)
#添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("速度",fontproperties=my_font)
plt.title("标题",fontproperties=my_font)
#展示
plt.show()
截图:
实例4:绘制竖条形图
from matplotlib import pyplot as plt
from matplotlib import font_manager
#设置图形大小
plt.figure(figsize=(12,7),dpi=100)
#设置字体
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
#添加数据
a = ["战狼2","速度与激情8","功夫瑜伽","西游降妖篇","变形金刚5:\n最后的骑士",
"摔跤吧!爸爸","加勒比海盗5:\n死无对证","金刚:骷髅岛","极限特工:\n终极回归",
"生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:\n殊死一战",
"蜘蛛侠\n:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,3.32,6.99,6.88,6.86,6.58,2.23]
#绘制条形图
plt.bar(range(len(a)),b)
#设置x轴刻度
plt.xticks(range(len(a)),a,rotation = 90,fontproperties=my_font)
#添加描述信息
plt.xlabel("电影名字",fontproperties=my_font)
plt.ylabel("票房 单位(亿)",fontproperties=my_font)
plt.title("电影票房",fontproperties=my_font)
#展示
plt.show()
截图:
实例5.绘制横条形图
from matplotlib import pyplot as plt
from matplotlib import font_manager
#设置图形大小
plt.figure(figsize=(12,7),dpi=100)
#设置字体
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
#添加数据
a = ["战狼2","速度与激情8","功夫瑜伽","西游降妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸",
"加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪",
"神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传",
"银河护卫队2","情圣","新木乃伊"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,3.32,6.99,6.88,6.86,6.58,2.23]
#绘制条形图
plt.barh(range(len(a)),b)
#设置字符串到x轴
plt.yticks(range(len(a)),a,rotation = 0,fontproperties=my_font)
#添加描述信息
plt.ylabel("电影名字",rotation = 45,fontproperties=my_font)
plt.xlabel("票房 单位(亿)",fontproperties=my_font)
plt.title("电影票房",fontproperties=my_font)
#添加网络
plt.grid(alpha = 0.4)
#展示
plt.show()
截图:
实例6:绘制多个条形度
from matplotlib import pyplot as plt
from matplotlib import font_manager
#设置图形大小
plt.figure(figsize=(12,7),dpi=100)
#设置字体
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
#添加数据
a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_14 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_16 = [2358,399,2358,362]
#设置x轴距离
bar_width = 0.2 #设置条形图宽度
x_14 = list(range(len(a))) #14号x轴的距离分布
x_15 = [i+bar_width for i in x_14] #15号紧跟在14号后面,所以在14号基础上加一个bar_width
x_16 = [i+bar_width for i in x_15] #16号原理同15号
#绘制条形图
plt.bar(range(len(a)),b_14,width=bar_width,label="9月14日")
plt.bar(x_15,b_15,width=bar_width,label="9月15日")
plt.bar(x_16,b_16,width=bar_width,label="9月16日")
#设置字符串到x轴
plt.xticks(x_15,a,rotation = 0,fontproperties=my_font) #15号字符串刚好取中
#添加图例
plt.legend(prop=my_font)
#添加描述信息
plt.xlabel("电影名称",fontproperties=my_font)
plt.ylabel("票房 单位(亿)",fontproperties=my_font)
plt.title("3天票房对比",fontproperties=my_font)
#添加网络
plt.grid(alpha = 0.4)
#票房
plt.show()
截图:
实例7:绘制直方图
from matplotlib import pyplot as plt
#设置图形大小
plt.figure(figsize=(12,7),dpi=100)
interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
#绘制直方图
plt.bar(range(12),quantity,width=1)
#设置x轴刻度
_x = [i-0.5 for i in range(13)]
_xticks_labels = interval + [150]
plt.xticks(_x,_xticks_labels)
#绘制网格
plt.grid()
#展示图片
plt.show()
截图:
Numpy部分
1.Numpy Ndarray对象
NumPy最重要的一个特点是其N维数组对象ndarray,它是一系列同类型数据的集合,以0下标为开始进行集中元素的索引。
使用numpy生成数组,得到ndarray的类型
numpy.array()
numpy.arange()
import numpy as np
import random
#使用numpy生成数据,得到ndarry的类型
t1 = np.array([1,2,3])
print(t1)
print(type(t1))
print("=" * 50)
t2 = np.array(range(10))
print(t2)
print(type(t2))
print("=" * 50)
t3 = np.arange(4,10,2)
print(t3)
print(type(t3))
print("=" * 50)
t4 = np.array(range(1,4),dtype=float)
print(t4)
print(t4.dtype)
print("=" * 50)
t5 = np.array([1,1,0,1,0],dtype=bool)
print(t5)
print(t5.dtype)
print("=" * 50)
t6 = t5.astype("int") #修改数据类型
print(t6)
print(t6.dtype)
print("=" * 50)
t7 = np.array([random.random() for i in range(18)])
print(t7)
print(t7.dtype)
print("=" * 50)
#两位小数
t8 = np.round(t7,2)
print(t8)
print(t8.dtype)
[1 2 3]
<class 'numpy.ndarray'>
==================================================
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
==================================================
[4 6 8]
<class 'numpy.ndarray'>
==================================================
[1. 2. 3.]
float64
==================================================
[ True True False True False]
bool
==================================================
[1 1 0 1 0]
int32
==================================================
[0.61603861 0.02896186 0.12319433 0.95822558 0.26362422 0.67238274
0.43073237 0.43314739 0.98498236 0.34943075 0.42417254 0.01753995
0.046794 0.96810449 0.47940812 0.09144121 0.26297822 0.06319607]
float64
==================================================
[0.62 0.03 0.12 0.96 0.26 0.67 0.43 0.43 0.98 0.35 0.42 0.02 0.05 0.97
0.48 0.09 0.26 0.06]
float64
2.Numpy数据类型
图片来自菜鸟教程
3.Numpy广播(Broadcast)
广播(Broadcast)是numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。 如果两个数组a和b形状相同,即满足a.shape == b.shape,那么a*b的结果就是a与b数组相应位相乘。这要求维数相同,且各维度的长度相同。
import numpy as np
#当运算中的两个数组的形状不同时,numpy将自动触发广播机制。
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print(c)
#两个数组的列数要相同,否则报错
截图:
import numpy as np
a = np.array([[0,0,0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
截图:
4.Numpy创建数组
ndarry数组除了可以使用底层ndarry构造器来创建外,也可以通过以下几种方式来创建
numpy.zero(shape, dtype = float, order = 'c')
- 创建指定大小的数组,数组元素以0来填充 。numpy.ones(shape, dtype = None, order = 'c')
- 创建指定形状的数组,数组元素以1来填充
import numpy as np
#默认为浮点数
x = np.zeros(5)
print(x)
print("=" * 20)
#设置类型为整数
y = np.zeros((5,), dtype=np.int)
print(y)
print("=" * 20)
#自定义类型
z = np.zeros((2,2), dtype=[('x', 'i4'), ('y','i4')])
print(z)
print("=" * 20)
#自定义类型
z = np.zeros((2,2), dtype=[('x', 'float'), ('y','i4')])
print(z)
import numpy as np
#默认为浮点数
x = np.ones(5)
print(x)
print("=" * 20)
#自定义类型
x = np.ones([2, 2], dtype=int)
print(x)
print("=" * 20)
#自定义类型
x = np.ones([2, 2], dtype=[('a','float'),('b','i4')])
print(x)
5.Numpy数组操作
1)修改数组形状
- numpy.reshape()
- numpy.ndarry.flatten()
import numpy as np
#数组形状
t1 = np.array(range(12))
print(t1.shape)
print(t1)
print("=" * 50)
t2 = np.array([[1,2,3],[4,5,6]])
print(t2.shape)
print("=" * 50)
#修改数组形状
t3 = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
print(t3.reshape(3,4))
print("=" * 50)
t4 = np.arange(12).reshape(3,4)
print(t4)
print("=" * 50)
print(t4.reshape(12,)) #转为一维
print("=" * 50)
print(t4.reshape(12,1)) #转为12行1列
print("=" * 50)
print(t4.reshape(1,12))
print("=" * 50)
#多维数组展开,更改对原数组不影响
print(t4.flatten())
2)翻转数组
numpy.transpose()
numpy.ndarray.T
import numpy as np
a = np.arange(12).reshape(3,4)
print('原数组:')
print(a)
print('对换数组:')
print(np.transpose(a))
import numpy as np
a = np.arange(12).reshape(3,4)
print('原数组:')
print(a)
print('转置数组:')
print(a.T)
print('*' * 20)
print(np.transpose(a))
3)连接数组
numpy.hstack(a,b)
- 它通过水平堆叠来生成数组
numpy.vstack(a,b)
- 它通过垂直堆叠来生成数组
import numpy as np
a = np.array([[1,2],[3,4]])
print('第一个数组:')
print(a)
b = np.array([[5,6],[7,8]])
print('第二个数组:')
print(b)
print('水平堆叠:')
c = np.hstack((a,b))
print(c)
print('*'*20 + '分割线' + '*'*20)
d = np.vstack((a,b))
print('竖直堆叠:')
print(d)
4)数组的行列交换
import numpy as np
t = np.arange(0,12).reshape(3,4)
print(t)
print("=" * 20)
#交换2,3行
t[[1,2],:] = t[[2,1],:]
print(t)
print("=" * 20)
#交换1,3列
t[:,[0,2]] = t[:,[2,0]]
print(t)
print("=" * 20)
6、NumPy切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,与Python中的list的切片操作一样。 ndarray数组可以基于0-n的下标进行索引,切片对象可以通过内置的slice函数,并设置start,stop及step参数进行,从原数组中切割出一个新数组
import numpy as np
a = np.arange(10)
print(a)
print("=" * 20)
s = slice(2,7,2)
print(a[s])
以上实例中,我们首先通过arange()函数创建ndarray对象。然后,分别设置起始,终止和步长的参数为2,7和2。 我们也可以通过冒号分隔片参数start:stop:step来进行切片
import numpy as np
a = np.arange(10)
b = a[2:7:2] #从索引 2 开始,到索引 7 停止,间隔为 2
print(b)
冒号:的解释:如果只放置一个参数,如[2],将返回与该索引相对应的单个元素。如果为[2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如[2:7],那么则提取两个索引(不包含停止索引)之间的项。
import numpy as np
t2 = np.arange(1,37).reshape(6,6)
print(t2)
print('=' * 50)
#取行,取第3行
print(t2[2])
print('=' * 50 )
#取多行,取第3行及以后的数据
print(t2[2:])
print('=' * 50)
#取不连续多行,取第2,3,5,行数据
print(t2[[1,2,4]])
print('=' * 50)
#取列,取第2列
print(t2[:,1])
print('=' * 50)
#取连续多列,取第3列及以后数据
print(t2[:,2:])
print('=' * 50)
#取不连续多列,取第1,3列
print(t2[:,[0,2]])
print('=' * 50)
#取多行多列,取3-5行2-4列
print(t2[2:5,1:4])
print('=' * 50)
#取多个不相邻的点,两个列表对应的值分别作为行和列(0,0)(2,1)(2,3)
print(t2[[0,2,2],[0,1,3]])
print('=' * 50)
#修改值,np.where(三元运算符)把 t2 中小于 10 的替换成 0 ,大于等于 10 的替换成 10
print(np.where(t2<10,0,10))
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]
[25 26 27 28 29 30]
[31 32 33 34 35 36]]
==================================================
[13 14 15 16 17 18]
==================================================
[[13 14 15 16 17 18]
[19 20 21 22 23 24]
[25 26 27 28 29 30]
[31 32 33 34 35 36]]
==================================================
[[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[25 26 27 28 29 30]]
==================================================
[ 2 8 14 20 26 32]
==================================================
[[ 3 4 5 6]
[ 9 10 11 12]
[15 16 17 18]
[21 22 23 24]
[27 28 29 30]
[33 34 35 36]]
==================================================
[[ 1 3]
[ 7 9]
[13 15]
[19 21]
[25 27]
[31 33]]
==================================================
[[14 15 16]
[20 21 22]
[26 27 28]]
==================================================
[ 1 14 16]
==================================================
[[ 0 0 0 0 0 0]
[ 0 0 0 10 10 10]
[10 10 10 10 10 10]
[10 10 10 10 10 10]
[10 10 10 10 10 10]
[10 10 10 10 10 10]]
- 布尔索引:布尔索引通过布尔运算(如:比较运算)来获取符合指定条件的元素的数组。
import numpy as np
x = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(x)
#现在我们会打印出大于 5 的元素
print('大于 5 的元素:')
print(x[x > 5])
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
大于 5 的元素:
[ 6 7 8 9 10 11]
7、NumPy统计函数
NumPy提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等
numpy.amin() 和 numpy.amix()
- numpy.amin() 用于计算数组中的元素沿指定轴的最小值。
- numpy.amix() 用于¥¥¥¥¥¥¥¥¥¥¥¥¥最大值。
import numpy as np
a = np.array([[2,10,20],[80,43,31],[22,43,10]])
print("原始数组:\n")
print(a)
print('\n')
print("数组中最小元素:",np.amin(a))
print("数组中最大元素:",np.amax(a))
print('\n')
print("数组列中最小元素:",np.amin(a,0))
print("数组列中最大元素:",np.amax(a,0))
print('\n')
print("数组行中最小元素:",np.amin(a,1))
print("数组行中最大元素:",np.amax(a,1))
原始数组:
[[ 2 10 20]
[80 43 31]
[22 43 10]]
数组中最小元素: 2
数组中最大元素: 80
数组列中最小元素: [ 2 10 10]
数组列中最大元素: [80 43 31]
数组行中最小元素: [ 2 31 10]
数组行中最大元素: [20 80 43]
numpy.ptp()
- numpy.ptp() 函数计算数组中元素最大值与最小值的差(大 - 小)
import numpy as np
a = np.array([[2,10,20],[80,43,31],[22,43,10]])
print("原始数组:\n",a)
print('\n')
print("轴1 峰间值:",np.ptp(a,1))
print("轴0 峰间值:",np.ptp(a,0))
原始数组:
[[ 2 10 20]
[80 43 31]
[22 43 10]]
轴1 峰间值: [18 49 33]
轴0 峰间值: [78 33 21]
numpy.percentile()
- numpy.percentile() 函数得到百分位数,百分位数是统计中使用的度量,表示这个值的观察值占总数的百分比。
- 例如,第80个百分位数是这样一个值,它至少有80%的数据项小于或等于这个值,且至少有(100-80)%的数据项大于或等于这个值。
函数语法:
numpy.percentile(input, q, axis)
参数:
- input:输入数组
- q:要计算的百分位数,在0~100之间
- axis:计算百分位数的轴方向,二维取值0,1
import numpy as np
a = np.array([[2,10,20],[80,43,31],[22,43,10]])
print("原始数组:\n",a)
print('\n')
print("轴0 百分位数",np.percentile(a,10,0))
print("轴1 百分位数",np.percentile(a,10,1))
原始数组:
[[ 2 10 20]
[80 43 31]
[22 43 10]]
轴0 百分位数 [ 6. 16.6 12. ]
轴1 百分位数 [ 3.6 33.4 12.4]
计算数组项的中值、平均值、加权平均值
-
numpy.median()
- numpy.median() 函数用于计算数组 a 中元素的中位数(中值)
-
numpy.mean()
- numpy.mean() 函数返回数组中元素的算术平均值。 如果提供了轴,则沿其计算
-
numpy.average()
- numpy.average() 函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。 该函数可以接受一个轴参数。
- 如果没有指定轴,则数组会被展开
- 考虑一份数组[1,2,3,4]和相应的权值[4,3,2,1],通过将对应元素的乘积相加,再除以权值的和来计算加权平均值
- 加权平均值 = (1*4 + 2*3 + 3*2 + 4*1)/(4+3+2+1)
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print("原始数组:\n",a)
print('\n')
print("轴0 中值:",np.median(a,0))
print("轴0 平均值:",np.mean(a,0))
wt = np.array([0,0,10])
print("轴1 加权平均值:",np.average(a,1,weights=wt))
原始数组:
[[1 2 3]
[4 5 6]
[7 8 9]]
轴0 中值: [4. 5. 6.]
轴0 平均值: [4. 5. 6.]
轴1 加权平均值: [3. 6. 9.]
标准与方差
-
numpy.std()
- 要计算标准差,可以使用std()函数。
- 标准差的公式:
- std = sqrt(mean(abs(x - x.mean())**2))
-
numpy.var()
- 要计算方差,可以使用var()函数。
- 方差公式
- var = mean(abs(x - x.mean())**2)
import numpy as np
print(np.std([1,2,3,4]))
print(np.var([1,2,3,4]))
1.118033988749895
1.25
8.Numpy读取数据
np.loadtxt(frame,dtype=np.float,delimiter=None)
- frame:文件、字符串或产生器,可以是.gz或.bzz压缩文件
- dtype:数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float
- delimiter:分隔字符串,默认是任何空格,改为逗号
import numpy as np
#数据路径
us_data = r"datacombine.csv"
#添加数据,设置按逗号进行数据分隔,如果数据元素值比较大,这里dtype不设置为int,则会以科学计数法展示
us_data = np.loadtxt(us_data,delimiter=",",dtype="int")
print(us_data)
[[ 6 1 46 74 9039 9145]
[ 18 4 114 106 7718 7871]
[ 14 2 81 69 6820 6919]
...
[ 23 6 16 110 852 1010]
[ 43 11 22 104 635 784]
[ 36 6 30 70 1031 1131]]