python数据分析--数值计算工具Numpy

说明:本文只做Numpy的学习记录
参考内容:
(1)微信公众号:数据分析--1480 https://mp.weixin.qq.com/s/54fQScsNn9Sg-G02CEoaOw
(2)从零开始学Python数据分析与挖掘/刘顺祥著.—北京:清华大学出版社,2018
(3)从零开始学Python数据分析(视频教学版)作者:罗攀 出版社:机械工业出版社 出版时间:2018-07

1. 使用numpy构建数组和矩阵

1.1 创建数组或矩阵

import numpy as np

# 单个列表或元组创建一维数组
arr1 = np.array([1,2.5,3.2,4.1])
print(arr1)

arr2 = np.array((10,20,30,40,50))
print(arr2)

# 创建3x3的二维矩阵
arr3 = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
print(arr3)

# 查看数组和矩阵维度
print(arr1.shape)
print(arr2.shape)
print(arr3.shape)

# 查看数组的数据类型
print(arr1.dtype)
print(arr2.dtype)
print(arr3.dtype)
[1.  2.5 3.2 4.1]
[10 20 30 40 50]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
(4,)
(5,)
(3, 4)
float64
int32
int32

1.2 获取元素

使用索引的方式获取元素,一维数组和元组列表类似,在二维数组中,位置索引必须写成[rows,cols]的形式,方括号的前半部分用于控制二维数组的行索引,后半部分用于控制数组的列索引。

# 获取一维数组元素
print(arr1[0])

# 获取二维数组中的第1,2行元素
print(arr3[[0,1],:],'\n') 

#获取二维数组第2,3,4列元素
print(arr3[:,[1,2,3]],'\n')

#第1行第3个和第3行第4个
print(arr3[[0,2],[2,3]],'\n')  

#获取某几行某几列元素
print(arr3[[0,2],:][:,[2,3]],'\n') #第1行3,4列和第3行3,4列

#上面的操作可以使用np.ix_函数替换
print(arr3[np.ix_([0,2],[2,3])],'\n')

1.0
[[0 1 2 3]
 [4 5 6 7]] 

[[ 1  2  3]
 [ 5  6  7]
 [ 9 10 11]] 

[ 2 11] 

[[ 2  3]
 [10 11]] 

[[ 2  3]
 [10 11]] 

1.3 数据的存储和加载

1.3.1 数据的存储

通过使用numpy模块中的savetxt函数实现python数据的写出,函数语法如下:
np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ')

fname= r'E:/Data/2/npsavetxt.csv'
arr  = np.arange(12).reshape(4,3)
np.savetxt(fname, arr, delimiter=',')

1.3.2 数据加载

numpy模块还提供了读取数据与写数据的函数,方便我们将外部数据文件读入到Python的工作环境中。这里推荐两个读数据的函数:


#读入数据

arr = np.genfromtxt(fname= r'E:/Data/2/npsavetxt.csv', delimiter=',')
arr2 = np.loadtxt(fname= r'E:/Data/2/npsavetxt.csv', delimiter=',')

print(arr)
print(arr2)
[[ 0.  1.  2.]
 [ 3.  4.  5.]
 [ 6.  7.  8.]
 [ 9. 10. 11.]]
[[ 0.  1.  2.]
 [ 3.  4.  5.]
 [ 6.  7.  8.]
 [ 9. 10. 11.]]

fname:指定外部文件的路径
delimiter:指定文件中数据列的分隔符
skiprows:指定读数时跳过的行数
skip_header:指定跳过首行
usecols:指定读取的数据列

1.4 改变数组的形状

数组形状处理的手段主要有reshape、resize、ravel、flatten、vstack、hstack、row_stack和colum_stack,下面通过简单的案例来解释这些“方法”或函数的区别。

# reshape 改变的是副本
print(arr3)
print(arr3.shape) #3x4 =12 12个元素可以改为2x6

print(arr3.reshape(2,6))
print(arr3.shape)
print(arr3)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
(3, 4)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
(3, 4)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
#  resize 是真正的改变
# 为了便于比较,使得操作不去改变arr3,重新创建和arr3一样数值的数arr4
# 创建3x3的二维矩阵
arr4 = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
print(arr4)
print(arr4.shape)

print(arr4.resize(2,6))
print(arr4.shape) 
print(arr4)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
(3, 4)
None
(2, 6)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
# 多维数组降为一维数组,利用ravel、flatten和reshape三种方法均可以轻松解决:
arr5 = np.array([[1,10,100],[2,20,200],[3,30,300]])

#按行降维
print(arr5.ravel()) 
print(arr5.flatten())
print(arr5.reshape(-1))
print('\n')

# 按列降维
print(arr5.ravel(order = 'F')) 
print(arr5.flatten(order = 'F'))
print(arr5.reshape(-1,order = 'F'))
[  1  10 100   2  20 200   3  30 300]
[  1  10 100   2  20 200   3  30 300]
[  1  10 100   2  20 200   3  30 300]


[  1   2   3  10  20  30 100 200 300]
[  1   2   3  10  20  30 100 200 300]
[  1   2   3  10  20  30 100 200 300]
# 通过flatten方法实现的降维返回的是复制,因为对降维后的元素做修改,并没有影响到原数组。
# 相反,ravel方法与reshape方法返回的则是视图,通过对视图的改变,是会影响到原数组。

# 更改预览值
arr5.flatten()[0] = 2000
print('flatten方法:\n',arr5)
arr5.ravel()[1] = 1000
print('ravel方法:\n',arr5)
arr5.reshape(-1)[2] = 3000
print('reshape方法:\n',arr5)
flatten方法:
 [[   1 1000  100]
 [   2   20  200]
 [   3   30  300]]
ravel方法:
 [[   1 1000  100]
 [   2   20  200]
 [   3   30  300]]
reshape方法:
 [[   1 1000 3000]
 [   2   20  200]
 [   3   30  300]]
#vstack用于垂直方向(纵向)的数组堆叠,其功能与row_stack函数一致,
#而hstack则用于水平方向(横向)的数组合并,其功能与colum_stack函数一致

arr6 = np.array([1,2,3])
print('vstack纵向合并数组:\n',np.vstack([arr5,arr6]))
print('row_stack纵向合并数组:\n',np.row_stack([arr5,arr6]))
arr7 = np.array([[5],[15],[25]])
print('hstack横向合并数组:\n',np.hstack([arr5,arr7]))
print('column_stack横向合并数组:\n',np.column_stack([arr5,arr7]))
print(arr5)
print('垂直方向计算数组的和:\n',np.sum(arr5,axis = 0))
print('水平方向计算数组的和:\n',np.sum(arr5, axis = 1))
vstack纵向合并数组:
 [[   1 1000 3000]
 [   2   20  200]
 [   3   30  300]
 [   1    2    3]]
row_stack纵向合并数组:
 [[   1 1000 3000]
 [   2   20  200]
 [   3   30  300]
 [   1    2    3]]
hstack横向合并数组:
 [[   1 1000 3000    5]
 [   2   20  200   15]
 [   3   30  300   25]]
column_stack横向合并数组:
 [[   1 1000 3000    5]
 [   2   20  200   15]
 [   3   30  300   25]]
[[   1 1000 3000]
 [   2   20  200]
 [   3   30  300]]
垂直方向计算数组的和:
 [   6 1050 3500]
水平方向计算数组的和:
 [4001  222  333]

2. 数组的基本运算

2.1 四则运算

四则运算中的符号分别是“+-*/”,对应的numpy模块函数分别是np.add、np. subtract、np.multiply和np.divide

a = np.array([10,20,30,40])
b = np.array([1,2,5,10])

print("加法:\n", np.add(a,b) )
print("减法:\n", np.subtract(a,b))
print("乘法:\n", np.multiply(a,b) )
print("除法:\n", np.divide(a,b))
加法:
 [11 22 35 50]
减法:
 [ 9 18 25 30]
乘法:
 [ 10  40 150 400]
除法:
 [10. 10.  6.  4.]

2.2 求余、整除、指数运算


print("求余数:\n", np.fmod(a,b))
print("整除:\n", np.modf(a/b)[1])
print("指数:\n", np.power(a,b) )
 
求余数:
 [0 0 0 0]
整除:
 [10. 10.  6.  4.]
指数:
 [        10        400   24300000 1073741824]

2.3 比较运算

运用比较运算符可以返回bool类型的值,即True和False。一般有两种情况会普遍使用到比较运算符,一个是从数组中查询满足条件的元素,另一个是根据判断的结果执行不同的操作。

arr7 = np.array([[1,2,10],[10,8,3],[7,6,5]])
arr8 = np.array([[2,2,2],[3,3,3],[4,4,4]])
arr9 = np.array([3,10,23,7,16,9,17,22,4,8,15])

# 取子集
print('从arr7中取出arr7大于arr8的所有元素:\n',arr7[arr7>arr8])
print('从arr9中取出大于10的元素:\n',arr9[arr9>10])

# 判断操作
print('将arr7中大于7的元素改成5,其余的不变:\n',np.where(arr7>7,5,arr7))
print('将arr9中大于10 的元素改为1,否则改为0:\n',np.where(arr9>10,1,0))
从arr7中取出arr7大于arr8的所有元素:
 [10 10  8  7  6  5]
从arr9中取出大于10的元素:
 [23 16 17 22 15]
将arr7中大于7的元素改成5,其余的不变:
 [[1 2 5]
 [5 5 3]
 [7 6 5]]
将arr9中大于10 的元素改为1,否则改为0:
 [0 0 1 0 1 0 1 1 0 0 1]

2.4 广播运算

前面所介绍的各种数学运算符都是基于相同形状的数组,当数组形状不同时,也能够进行数学运算的功能称为数组的广播。但是数组的广播功能必须遵守一定的规则:

  • 各输入数组的维度可以不相等,但必须确保从右到左的对应维度值相等。
  • 如果对应维度值不相等,就必须保证其中一个为1。
  • 各输入数组都向其shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐。
#对应位置相加,没有广播
# 各输入数组维度一致,对应维度值相等
arr10 = np.arange(12).reshape(3,4)
arr11 = np.arange(101,113).reshape(3,4)
print(arr10)
print(arr11)
print('3×4的二维矩阵运算:\n',arr10 + arr11)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[101 102 103 104]
 [105 106 107 108]
 [109 110 111 112]]
3×4的二维矩阵运算:
 [[101 103 105 107]
 [109 111 113 115]
 [117 119 121 123]]
# 广播第1条、各输入数组维度不一致,对应维度值相等
arr12 = np.arange(60).reshape(5,4,3)
arr10 = np.arange(12).reshape(4,3)
# print(arr10)
# print(arr12)
print('最终得到5×4×3的数组:\n',arr12 + arr10)
#虽然维数不一样,但末尾的两个维度值是一样的,都是4和3,所以,结果是1个三维数组(5个二维数组)和1个两维数组的和。
最终得到5×4×3的数组:
 [[[ 0  2  4]
  [ 6  8 10]
  [12 14 16]
  [18 20 22]]

 [[12 14 16]
  [18 20 22]
  [24 26 28]
  [30 32 34]]

 [[24 26 28]
  [30 32 34]
  [36 38 40]
  [42 44 46]]

 [[36 38 40]
  [42 44 46]
  [48 50 52]
  [54 56 58]]

 [[48 50 52]
  [54 56 58]
  [60 62 64]
  [66 68 70]]]
# 广播第2条,各输入数组维度不一致,对应维度值不相等,但其中有一个为1
arr12 = np.arange(60).reshape(5,4,3) # 5个4*3 的二维矩阵
arr13 = np.arange(4).reshape(4,1)   #  4*1的一维列矩阵,加到4*3 的每列上。
# print(arr13)
# print(arr12)
print('维数不一致,维度值也不一致,但维度值至少一个为1:\n',arr12 + arr13)
维数不一致,维度值也不一致,但维度值至少一个为1:
 [[[ 0  1  2]
  [ 4  5  6]
  [ 8  9 10]
  [12 13 14]]
  
 [[12 13 14]
  [16 17 18]
  [20 21 22]
  [24 25 26]]

 [[24 25 26]
  [28 29 30]
  [32 33 34]
  [36 37 38]]

 [[36 37 38]
  [40 41 42]
  [44 45 46]
  [48 49 50]]

 [[48 49 50]
  [52 53 54]
  [56 57 58]
  [60 61 62]]]
# 广播第3条, 加1补齐
arr14 = np.array([5,15,25])
# print(arr14)
# print(arr10)
print('arr14的维度自动补齐为(1,3):\n',arr10 + arr14)
# 将arr14的三个元素分别与arr10的3列元素分别相加
arr14的维度自动补齐为(1,3):
 [[ 5 16 27]
 [ 8 19 30]
 [11 22 33]
 [14 25 36]]

3. numpy中常用的数学和统计函数

numpy模块的核心就是基于数组的运算,相比于列表或其他数据结构,数组的运算效率是最高的。在统计分析和挖掘过程中,经常会使用到numpy模块的函数。
python数据分析--数值计算工具Numpy_第1张图片
轴的概念: 统计函数都有axis参数,该参数的目的就是在统计数组元素时需要按照不同的轴方向计算,如果axis=1,则表示按水平方向计算统计值,即计算每一行的统计值;如果axis=0,则表示按垂直方向计算统计值,即计算每一列的统计值。

arr = np.array([[1,10,100],[2,20,200],[3,30,300]])
print(arr)

print("垂直方向计算数组的和:\n",np.sum(arr, axis=0))

print("水平方向计算数组的和:\n",np.sum(arr, axis=1))
[[  1  10 100]
 [  2  20 200]
 [  3  30 300]]
垂直方向计算数组的和:
 [  6  60 600]
水平方向计算数组的和:
 [111 222 333]

4. 线性代数的相关计算

数据挖掘的理论背后几乎离不开有关线性代数的计算问题,如矩阵乘法、矩阵分解、行列式求解等。Numpy的子模块linalg可以解决各种线性代数相关的计算。
python数据分析--数值计算工具Numpy_第2张图片

4.1 零、一、单位矩阵

print(np.zeros(10))
print(np.ones(10))
print(np.eye(3))
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

4.2 行列式、矩阵乘法、对角线

arr1 = np.array([[1,2],[3,4]])
arr2 =  np.array([[1,1],[1,2]])
print("arr1 : \n",arr1)
print("arr2 : \n",arr2)

# 计算行列式
print("arr1 的行列式为:\n", np.linalg.det(arr1))
print("arr2 的行列式为:\n", np.linalg.det(arr2))

# 矩阵乘法
print("arr1 * arr2 : \n" , np.dot(arr1,arr2))
print("arr2 * arr1 : \n" , np.dot(arr2,arr1))

# 计算主对角线元素
print("arr1 的主对角线元素:\n",np.diag(arr1))
print("arr1 的主对角线元素之和:\n",np.trace(arr1))
arr1 : 
 [[1 2]
 [3 4]]
arr2 : 
 [[1 1]
 [1 2]]
arr1 的行列式为:
 -2.0000000000000004
arr2 的行列式为:
 1.0
arr1 * arr2 : 
 [[ 3  5]
 [ 7 11]]
arr2 * arr1 : 
 [[ 4  6]
 [ 7 10]]
arr1 的主对角线元素:
 [1 4]
arr1 的主对角线元素之和:
 5

4.3 转置矩阵、可逆矩阵

arr1 = np.array([[1,2],[3,4]])
arr2 =  np.array([[1,1],[1,2]])

# 转置矩阵
print("arr1 的转置矩阵为:\n",np.transpose(arr1)) 

# 计算可逆矩阵(二阶主对换,副变号)
print("arr1 的可逆矩阵为:\n", np.linalg.inv(arr1))
print("arr2 的可逆矩阵为:\n", np.linalg.inv(arr2))
arr1 的转置矩阵为:
 [[1 3]
 [2 4]]
arr1 的可逆矩阵为:
 [[-2.   1. ]
 [ 1.5 -0.5]]
arr2 的可逆矩阵为:
 [[ 2. -1.]
 [-1.  1.]]

4.4 特征值和特征向量

# 特征值和特征向量 (Aε = λε)
arr3 =  np.array([[2,-1,-1],[0,-1,0],[0,2,1]]) 

print("arr3 的特征值和特征向量为:\n", np.linalg.eig(arr3))   
arr3 的特征值和特征向量为:
 (array([ 2.,  1., -1.]), array([[ 1.        ,  0.70710678,  0.        ],
       [ 0.        ,  0.        ,  0.70710678],
       [ 0.        ,  0.70710678, -0.70710678]]))

4.5 多元一次方程求解

《九章算术》中有一题是这样描述的:今有上禾三秉,中禾二秉,下禾一秉,实三十九斗;上禾二秉,中禾三秉,下禾一秉,实三十四斗;上禾一秉,中禾二秉,下禾三秉,实二十六斗;问上、中、下禾实秉各几何?
python数据分析--数值计算工具Numpy_第3张图片

# AX = b     np.linalg.solve
A = np.array([[3,2,1],[2,3,1],[1,2,3]])
b = np.array([39,34,26])
X = np.linalg.solve(A,b)
print("三元一次方程组的解为:\n",X) 
三元一次方程组的解为:
 [9.25 4.25 2.75]

4.6 多元线性回归模型的解

多元线性回归模型一般用来预测连续的因变量,如根据天气状况预测游客数量、根据网站的活动页面预测支付转化率、根据城市人口的收入、教育水平、寿命等预测犯罪率等。该模型可以写成Y=Xβ+ε,其中Y为因变量,X为自变量,ε为误差项。要想根据已知的X来预测Y的话,必须得知道偏回归系数β的值。偏回归系数的求解方程,即β=(X'X)-1X’Y)。

# 计算偏回归系数
X = np.array([[1,1,4,3],[1,2,7,6],[1,2,6,6],[1,3,8,7],[1,2,5,8],[1,3,7,5],[1,6,10,12],[1,5,7,7],[1,6,3,4],[1,5,7,8]])
Y = np.array([3.2,3.8,3.7,4.3,4.4,5.2,6.7,4.8,4.2,5.1])

X_trans_X_inverse = np.linalg.inv(np.dot(np.transpose(X),X))
beta = np.dot(np.dot(X_trans_X_inverse,np.transpose(X)),Y)
print('偏回归系数为:\n',beta)
print("线性回归模型为:Y = %.3f + %.3fx1 + %.3fx2 + %.3fx3" %(beta[0],beta[1],beta[2],beta[3]))
偏回归系数为:
 [1.78052227 0.24720413 0.15841148 0.13339845]
线性回归模型为:Y = 1.781 + 0.247x1 + 0.158x2 + 0.133x3

4.7 范数的计算

范数常常用来度量某个向量空间(或矩阵)中的每个向量的长度或大小,它具有三方面的约束条件,分别是非负性、齐次性和三角不等性。最常用的范数就是p范数,其公示可表示为:
在这里插入图片描述

# 范数的计算
arr17 = np.array([1,3,5,7,9,10,-12])
# 一范数
res1 = np.linalg.norm(arr17, ord = 1)
print('向量的一范数:\n',res1)
# 二范数
res2 = np.linalg.norm(arr17, ord = 2)
print('向量的二范数:\n',res2)
# 无穷范数
res3 = np.linalg.norm(arr17, ord = np.inf)
print('向量的无穷范数:\n',res3)
向量的一范数:
 47.0
向量的二范数:
 20.223748416156685
向量的无穷范数:
 12.0

5. 伪随机数

numpy模块中的子模块random,包含了各种常见的随机数生成函数,如下图所示:
python数据分析--数值计算工具Numpy_第4张图片

5.1 离散分布

有时候为了保证每次产生的随机数相同,就需要设置固定的随机数种子,随机数种子的设定可通过seed函数。

5.1.1 二项分布

在概率论和统计学中,二项分布是n个独立的是/非试验中成功的次数的离散概率分布,其中每次试验的成功概率为p。二项分布的典型例子是扔硬币,硬币正面朝上概率为p, 重复扔n次硬币,k次为正面的概率即为一个二项分布概率。

import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

# 生成随机数
np.random.seed(123)
 
# 二项分布
rn1 = np.random.binomial(n = 10, p= 0.2, size = 10)
rn2 = np.random.binomial(n = 10, p = 0.2, size = (3,5)) 
print(rn1)
print(rn2)
# 绘图
plt.style.use('ggplot')
sns.distplot(rn1, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'black','label':'binomial1 ','linestyle':'-'})
sns.distplot(rn2, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'red','label':'binomial2','linestyle':'--'})
# 呈现图例
plt.legend()
# 呈现图形
plt.show()
[3 1 1 2 3 2 5 3 2 2]
[[1 3 2 0 2]
 [3 1 1 2 2]
 [2 3 3 2 3]]

python数据分析--数值计算工具Numpy_第5张图片

5.1.2 泊松分布

该分布适合于描述单位时间(或空间)内随机事件发生的次数。如某一服务设施在一定时间内到达的人数,电话交换机接到呼叫的次数,汽车站台的候客人数,机器出现的故障数。

import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

# 生成随机数
np.random.seed(1)
 
# 泊松分布
rn1 = np.random.poisson (lam = 6, size = 10 )
rn2 = np.random.poisson(lam = (10,50,20), size = (5,3)) 
print(rn1)
print(rn2)
# 绘图
plt.style.use('ggplot')
sns.distplot(rn1, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'black','label':'poisson1 ','linestyle':'-'})
sns.distplot(rn2, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'red','label':'poisson2','linestyle':'--'})
# 呈现图例
plt.legend()
# 呈现图形
plt.show()
[2 3 7 7 4 6 5 6 2 4]
[[11 52 13]
 [12 34 22]
 [17 61 19]
 [16 55 26]
 [12 45 22]]

python数据分析--数值计算工具Numpy_第6张图片

5.2 连续分布

5.2.1 正太分布

正太分布也称为高斯分布,呈现两头低,中间高,左右对称的倒钟型,是连续分布中应用最频繁的一种分布。

import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

# 生成各种正态分布随机数
np.random.seed(1234)
# 正太分布(均值, 方差, 个数)
rn1 = np.random.normal(loc = 0, scale = 1, size = 1000)
rn2 = np.random.normal(loc = 0, scale = 2, size = 1000)
rn3 = np.random.normal(loc = 2, scale = 3, size = 1000)
rn4 = np.random.normal(loc = 5, scale = 3, size = 1000)
 
# 绘图
plt.style.use('ggplot')
sns.distplot(rn1, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'black','label':'u=0,s=1','linestyle':'-'})
sns.distplot(rn2, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'red','label':'u=0,s=2','linestyle':'--'})
sns.distplot(rn3, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'blue','label':'u=2,s=3','linestyle':':'})
sns.distplot(rn4, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'purple','label':'u=5,s=3','linestyle':'-.'})
# 呈现图例
plt.legend()
# 呈现图形
plt.show()

python数据分析--数值计算工具Numpy_第7张图片

呈现的是不同均值和标准差下的正态分布概率密度曲线。当均值相同时,标准差越大,密度曲线越矮胖;当标准差相同时,均值越大,密度曲线越往右移。

5.2.2 指数分布

import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

# 生成各种指数分布随机数
np.random.seed(1234)
re1 = np.random.exponential(scale = 0.5, size = 1000)
re2 = np.random.exponential(scale = 1, size = 1000)
re3 = np.random.exponential(scale = 1.5, size = 1000)
# 绘图
sns.distplot(re1, hist = False, kde = False, fit = stats.expon, 
             fit_kws = {'color':'black','label':'lambda=0.5','linestyle':'-'})
sns.distplot(re2, hist = False, kde = False, fit = stats.expon, 
             fit_kws = {'color':'red','label':'lambda=1','linestyle':'--'})
sns.distplot(re3, hist = False, kde = False, fit = stats.expon, 
             fit_kws = {'color':'blue','label':'lambda=1.5','linestyle':':'})
# 呈现图例
plt.legend()
# 呈现图形
plt.show()

python数据分析--数值计算工具Numpy_第8张图片

通过图形可知,指数分布的概率密度曲线呈现在y=0的右半边,而且随着lambda参数的增加,概率密度曲线表现得越矮,同时右边的“尾巴”会更长而厚。

5.2.3 其它常用的分布

import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

# 生成随机数
np.random.seed(1234)
 
# 自由度为2的t分布
rn1 = np.random.standard_t(df = 3, size = (2,3))
 
# 自由度为2和5的f分布
rn2 = np.random.f(dfnum = 2,dfden = 5,size=(3,5)) 

# 1-10 之间的均匀分布,并四舍五入取整
rn3 = np.round(np.random.uniform(size=(3,4), low = 1, high = 10), 0)


# 绘图
plt.style.use('ggplot')
sns.distplot(rn1, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'black','label':'t ','linestyle':'-'})
sns.distplot(rn2, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'red','label':'f ','linestyle':'--'})
sns.distplot(rn3, hist = False, kde = False, fit = stats.norm, 
             fit_kws = {'color':'blue','label':'1-10 ','linestyle':':'})

# 呈现图例
plt.legend()
# 呈现图形
plt.show()

python数据分析--数值计算工具Numpy_第9张图片

你可能感兴趣的:(python数据分析--数值计算工具Numpy)