numpy抽样

  • 随机抽样
    • 离散型随机变量
      • 二项分布
      • 泊松分布
      • 超几何分布
    • 连续型随机变量
      • 均匀分布
      • 正态分布
      • 指数分布
    • 其他随机函数
      • 随机从序列中获取元素
      • 对数据集进行洗牌操作

随机抽样

numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数,如正态分布、泊松分布等。

  • numpy.random.seed(sedd=None) Seed the generator

seed()用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed()值,则每次生成的随机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时生成的随机数因时间差异而不同。

在对数据进行预处理时,经常加入新的操作或者改变处理策略,此时如果伴随着随即操作,最好还是指定唯一的随即种子,避免由于随机的差异对结果产生影响。

离散型随机变量

二项分布

二项分布可以用于一次实验只有两种结果,各结果对应的概率相等的多次实验的概率问题。比如猜10次拳赢6次的概率。
二项分布概率函数的代码表示:binom.pmf(k) = choose(n,k)p ** k(1-p) ** (n-k)

二项分布概率函数的数学表示:P{X=k}=(nk)pk(1−p)n−kP\{X=k\}=\begin{pmatrix}n \\ k\end{pmatrix}p^k(1-p)^{n-k}P{X=k}=(nk​)pk(1−p)n−k

  • numpy.random.binomial(n,p,size=None)Draw sample from a binomial distribution.

表示对一个二项分布进行采样,size表示采样的次数,n表示做了n重伯努利实验,p表示成功的概率,函数的返回值表示n中成功的次数。

【例】野外正在进行9(n=9)口石油勘探井的发掘工作,每一口井能够开发出油的概率是0.1(p=0.1).请问最终所有的勘探井都勘探失败的概率?

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201124)
n = 9#做某件事情的次数
p = 0.1#做某件事情成功的概率
size = 50000
x = np.random.binomial(n,p,size)
'''
或者使用binom.rvs
使用binom.rvs(n,p,size=1)函数模拟一个二项随机函数,可视化的表现概率
y = stats.binom.rvs(n,p,size=size)#返回一个numpy.ndarray
'''
print(np.sum(x == 0)/size)
plt.hist(x)
plt.xlabel('随机变量:成功次数')
plt.ylabel('样本中出现的次数')
plt.show()
#返回一个列表,列表中每个元素表示随机变量中对应值的概率
s = stats.binom.pmf(range(10),n,p)
print(np.around(s,3))
0.39

[0.387 0.387 0.172 0.045 0.007 0.001 0.    0.    0.    0.   ]

【例】模拟投硬币,投2次,请问两次都为正面的概率?

import numpy as np
from scipy import stats
import matplotlib.pyplot as pltnp.random.seed(20201124)
n = 2#做某件事儿的次数,这里是投两次硬币
p = 0.5#做某件事成功的概率,在这里即投硬币为正面的概率
size = 50000
x = np.random.binomial(n,p,size)
'''或者使用binom.rvs
#使用binom.rvs(n, p, size=1)函数模拟一个二项随机变量,可视化地表现概率
y = stats.binom.rvs(n, p, size=size)#返回一个numpy.ndarray
'''
print(np.sum(x == 0)/size)
print(np.sum(x == 1)/size)
print(np.sum(x == 2)/size)plt.hist(x,density=True)
plt.xlabel("随机变量:硬币为正面次数")
plt.ylabel("50000个样本中出现的次数")
plt.show()
s = stats.binom.pmf(range(n + 1),n,p)
print(np.around(s,3))
0.25062
0.50252
0.24686

[0.25 0.5  0.25]
import numpy as np
from scipy import stats
import matplotlib.pyplot as pltnp.random.seed(20201124)
n = 2#做某件事儿的次数,这里是投两次硬币
p = 0.5#做某件事成功的概率,在这里即投硬币为正面的概率
size = 50000
x = np.random.binomial(n,p,size)
#binom.rvs(n, p, size=1)#函数模拟一个二项随机变量,可视化地表现概率
y = stats.binom.rvs(n, p, size=size)#返回一个numpy.ndarray
print(np.sum(y == 0)/size)
print(np.sum(y == 1)/size)
print(np.sum(y == 2)/size)plt.hist(y,density=True)
plt.xlabel("随机变量:硬币为正面次数")
plt.ylabel("50000个样本中出现的次数")
plt.show()
s = stats.binom.pmf(range(n + 1),n,p)
print(np.around(s,3))
0.2509
0.49786
0.25124

[0.25 0.5  0.25]

计算期望和方差

期望:E(x) = np

方差:Var(x) = np(1-p)

利用stats.binom.stats(n,p,loc=0,moments=‘mv’)计算期望和方差

moments参数中:m为期望,v为方差

泊松分布

泊松分布主要用于估计某个时间段某时间发生的概率。
泊松概率函数的代码表示:poisson.pmf(k) = exp(-lam)lam * k/k!
泊松概率函数的数学表示:P(X=k)=λkk!e−λ,k=0,1,..P(X = k) = \frac{\lambda^k}{k!}e^{-\lambda},k = 0,1,..P(X=k)=k!λk​e−λ,k=0,1,..

  • numpy.random.poisson(lam=1.0,size=None)Draw sample from a Poisson distribution.

表示对一个泊松分布进行采样,size表示采样的次数,lam表示一个单位内发生事件的平均值,函数的返回值表示一个单位内时间发生的次数。

【例】假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少?

import numpy as np
from scipy import stats
import matplotlib.pyplot as pltnp.random.seed(20201124)
lam = 42 / 6#平均值,平均每是十分钟接到7次订票电话
size = 50000
x = np.random.poisson(lam,size)
'''或者
#模拟服从泊松分布的50000个随机变量
x = stats.poisson.rvs(lam,size=size)
'''
print(np.sum(x == 6) / size)plt.hist(x)
plt.xlabel("随机变量:每十分钟接到订票电话的次数")
plt.ylabel("50000个样本中出现的次数")
plt.show()
#用poisson.pmf(k,mu)求对应分布的概率:概率质量函数(PMF)
x = stats.poisson.pmf(6,lam)
print(x)
0.15206

0.14900277967433773

超几何分布

在超几何分布中,各次实验不是独立的,各次实验成功的概率也不相等。
超几何分布概率函数的数学表示:
p(k,M,n,N)=(nk)(M−nN−k)(MN)p(k,M,n,N)=\cfrac{\begin{pmatrix}n \\ k\end{pmatrix}\begin{pmatrix}M-n \\ N-k\end{pmatrix}}{\begin{pmatrix}M \\ N\end{pmatrix}}p(k,M,n,N)=(MN​)(nk​)(M−nN−k​)​

  • numpy.random.hypergeometric(ngood,nbad,nsample,size=None)
    Draw samples from a Hypergeometric distribution.
    表示对一个超几何分布进行采样,size表示采样的次数,ngood表示总体中具有成功标志的元素个数,nbad表示总体中不具有成功标志的元素个数,ngood+nbad表示总体样本容量,nsample表示抽取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取nsample个元素具中具有成功标志的元素个数。

[例]一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(20201124)
size = 500000
x = np.random.hypergeometric(ngood=7,nbad=13,nsample=12,size=size)
'''
或者使用rvs(M,n,N,loc=0,size=1,random_state=None)模拟
x = stats.hypergeom.rvs(M=20,n=7,N=12,size=size)
'''
print(np.sum(x == 3)/size)plt.hist(x,bins=8)
plt.xlabel("狗的数量")
plt.ylabel("500000个样本中出现的次数")
plt.title("超几何分布",fontsize=20)
plt.show()
'''
M为总体容量
n为总体中具有成功标志的元素的个数
N,k表示抽取N个元素有k个是成功元素
'''
x = range(8)
#用hypergeom.pmf(k,M,n,N,loc)来计算k次成功的概率
s = stats.hypergeom.pmf(k=x,M=20,n=7,N=12)
print(np.round(s,3))
0.19872

[0.    0.004 0.048 0.199 0.358 0.286 0.095 0.01 ]

‘’’
超几何分布的均值与方差

均值E(x) = N(n/M)

方差Var(x) = N(n/M)(1‐n/M)((M‐N)/(M‐1))

注释:考虑n次实验的超几何分布,令p=n/M,当总体容量足够大时((M‐N)/(M‐1))近似于1,此时数学期望为Np,方差为Np(1‐p).
#用stats(M, n, N, loc=0, moments=‘mv’)计算均值和方差
stats.hypergeom.stats(20,7,12,moments=‘mv’)
‘’’

stats.hypergeom.stats(20,7,12,moments='mv')
(array(4.2), array(1.14947368))

连续型随机变量

均匀分布

  • numpy.random.uniform(low=0.0,high=1.0,size=None)
    Draw samples from a uniform distribution.

样本均匀的分布在[low,high)区间,也就是说,在给定区间上任何值都是等可能的。

【例】在low到high范围内,创建大小为size的均匀分布的随机数。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201124)
a = 0
b = 100
size = 50000
x = np.random.uniform(a,b,size=size)
print(np.all(x >= 0))
print(np.all(x > 100))
y = (np.sum(x < 50) - np.sum(x < 10)) / size
print(y)
plt.hist(x,bins=20)
plt.show()
a = stats.uniform.cdf(10,0,100)
b = stats.uniform.cdf(50,0,100)
print(b-a)
True
False
0.4018

0.4

作为uniform的特例,rand可以得到[0,1)之间的均匀分布的随机数。

  • numpy.random.rand(d0,d1,…dn)
    给定形状数组的随机数
    【例】根据指定大小产生[0,1)之间均匀分布的随机数。
import numpy as np
np.random.seed(20201124)
print(np.random.rand(),'\n')
print(np.random.rand(5),'\n')#长度为5的一维数组
print(np.random.rand(4, 3))#4行3列的二维数组
np.random.seed(20201124)
print(np.random.uniform())
print(np.random.uniform(size=5))
print(np.random.uniform(size=(4, 3)))
0.16595762053434393 [0.18713139 0.16141027 0.08701148 0.89495402 0.44014387] [[0.45409661 0.15475296 0.70117664][0.19671135 0.62914882 0.60799848][0.69312633 0.07419549 0.46756484][0.94894489 0.51506329 0.03977621]]
0.16595762053434393
[0.18713139 0.16141027 0.08701148 0.89495402 0.44014387]
[[0.45409661 0.15475296 0.70117664][0.19671135 0.62914882 0.60799848][0.69312633 0.07419549 0.46756484][0.94894489 0.51506329 0.03977621]]

作为 uniform 的另一特例,可以得到 [low,high) 之间均匀分布的随机整数。

  • numpy.random.randint(low, high=None, size=None, dtype=‘l’)
    Return random integers from low (inclusive) to high (exclusive).

Return random integers from the “discrete uniform” distribution of the specified dtype in the “half-open” interval [low, high). If high is None (the default), then results are from [0,low).

【例】若 high 不为 None 时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

import numpy as np
np.random.seed(20201124)
x = np.random.randint(2,size=10)
print(x)x = np.random.randint(1,size=10)
print(x)x = np.random.randint(5,size=(2,4))
print(x)x = np.random.randint(1,10,[3,4])
print(x)
[0 1 1 0 0 0 0 0 1 1]
[0 0 0 0 0 0 0 0 0 0]
[[3 0 3 2][1 4 2 2]]
[[4 6 7 4][4 6 8 7][2 1 5 7]]

正态分布

标准正态分布的数学表示:
f(x)=e−x2/22πf(x)=\cfrac{e^{-x^2/2}}{\sqrt{2\pi}}f(x)=2π​e−x2/2​
正态分布的一般形式:
f(x)=12πσe−(x−μ)22σ2当u=0,σ=1时为标准正态分布f(x)=\cfrac{1}{\sqrt{2\pi}\sigma}e^{-\cfrac{(x-\mu)^2}{2\sigma^2}}\\当u=0,\sigma=1时为标准正态分布f(x)=2π​σ1​e−2σ2(x−μ)2​当u=0,σ=1时为标准正态分布

  • numpy.random.randn(d0,d1,…,dn)
    返回服从标准正态分布的样本/样本数组
    【例】根据指定大小产生满足标准正态分布的数组(均值为0,标准差为1)。
np.random.seed(20201124)
size = 50000
x = np.random.randn(size)
y1 = (np.sum(x<1)-np.sum(x<-1)) / size
y2 = (np.sum(x<2)-np.sum(x<-2)) / size
y3 = (np.sum(x<3)-np.sum(x<-3)) / size
print(y1)
print(y2)
print(y3)plt.hist(x,bins=20)
plt.show()
p1 = stats.norm.cdf(1) - stats.norm.cdf(-1)
p2 = stats.norm.cdf(2) - stats.norm.cdf(-2)
p3 = stats.norm.cdf(3) - stats.norm.cdf(-3)
print(p1)
print(p2)
print(p3)
0.68092
0.9557
0.99776

0.6826894921370859
0.9544997361036416
0.9973002039367398

还可指定分布以及所需参数来进行随机,例如高斯分布中的mu和sigma

  • numpy.random.normal(loc=0.0, scale=1.0, size=None) Draw random samples from a normal (Gaussian) distribution.

normal() 为创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(20201124)
x = 0.5 * np.random.randn(2,4) + 5
'''或者
#模拟10000个随机变量
x = 0.5*stats.norm.rvs(size=(2,4))+5
'''
print(x)
np.random.seed(20201124)
mu = 5#均值
sigma = 0.5#标准差
x = np.random.normal(mu,sigma,(2,4))
print(x)
size = 50000
x = np.random.normal(mu,sigma,size)
print(np.mean)
print(np.std(x,ddof=1))
'''
ddof:int, optional
Means Delta Degrees of Freedom. The divisor used in calculations is N ‐ ddof, where N
represents the number of elements. By default ddof is zero.
'''
[[4.79670884 4.78295086 4.92900556 5.46844893][4.40392523 4.92074704 4.53036121 5.31151958]]
[[4.79670884 4.78295086 4.92900556 5.46844893][4.40392523 4.92074704 4.53036121 5.31151958]]
<function mean at 0x7f0cb00c5940>
0.49927448795528623'\nddof:int, optional\nMeans Delta Degrees of Freedom. The divisor used in calculations is N ‐ ddof, where N\nrepresents the number of elements. By default ddof is zero.\n'

总体标准差:σ=∑i=1n(xi−xˉ)2n\sigma = \sqrt{\sum\limits_{i=1}^{n}\cfrac{(x_i-\bar{x})^2}{n}}σ=i=1∑n​n(xi​−xˉ)2​​

样本标准差:S=∑i=1n(xi−xˉ)2n−1S = \sqrt{\sum\limits_{i=1}^{n}\cfrac{(x_i-\bar{x})^2}{n-1}}S=i=1∑n​n−1(xi​−xˉ)2​​

标准误差:σn=σn\sigma_n = \cfrac{\sigma}{\sqrt{n}}σn​=n​σ​

方差:标准差的平方

plt.hist(x,bins=20)
plt.show()

指数分布

指数分布描述事件发生的时间长度间隔。

指数分布的数学表示:

  • numpy.random.exponential(scale=1.0,size=None)

Draw samples from an expinential distribution.

【例】 scale = 1/lambda

import numpy as np
import matplotlib.pyplot as plt
from scipy import statsnp.random.seed(20201124)
lam = 7
size = 50000
x = np.random.exponential(1 / lam,size)
'''或者
#rvs(loc=0, scale=1/lam, size=size, random_state=None)模拟
'''
y1 = (np.sum(x < 1 / 7)) / size
y2 = (np.sum(x < 2 / 7)) / size
y3 = (np.sum(x < 3 / 7)) / size
print(y1)
print(y2)
print(y3)plt.hist(x,bins=20)
plt.show()
y1 = stats.expon.cdf(1 / 7, scale=1 / lam)
y2 = stats.expon.cdf(2 / 7, scale=1 / lam)
y3 = stats.expon.cdf(3 / 7, scale=1 / lam)
print(y1) # 0.6321205588285577
print(y2) # 0.8646647167633873
print(y3) # 0.950212931632136
0.63272
0.86676
0.95212

0.6321205588285577
0.8646647167633873
0.950212931632136

其他随机函数

随机从序列中获取元素

  • numpy.random.choice(a, size=None, replace=True, p=None) Generates a random sample from a given 1-D array.

从序列中获取元素,若a为整数,元素取值从np.range(a)中随机获取,若a为数组,取值从a数组元素中随机获取,该函数还可以控制数组中的元素是否重复replace,以及选取元素的概率p。
【例】

import numpy as np
np.random.seed(20201124)
x = np.random.choice(10,3)
print(x)
x = np.random.choice(10,3,p=[0.05,0,0.05,0.9,0,0,0,0,0,0])
print(x)x = np.random.choice(10,3,replace=False,p=[0.05,0,0.05,0.9,0,0,0,0,0,0])
print(x)aa_milne_arr = ['pooh','rabbit','piglet','Christopher']
x = np.random.choice(aa_milne_arr,5,p=[0.5,0.1,0.1,0.3])
print(x)np.random.seed(20201124)
x = np.random.randint(0,10,3)
print(x)
[7 6 2]
[3 3 3]
[3 2 0]
['piglet' 'pooh' 'Christopher' 'pooh' 'piglet']
[7 6 2]

对数据集进行洗牌操作

数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要先对数据进行洗牌操作。

  • numpy.random.shuffle(x) Modify a sequence in-place ny shuffling its contents.

对 x 进行重排序,如果 x 为多维数组,只沿第 0 轴洗牌,改变原来的数组,输出为None。

【例】洗牌,改变自身内容,打乱顺序。

import numpy as np
np.random.seed(20201124)
x = np.arange(20)
np.random.shuffle(x)
print(x)print(np.random.shuffle([1,4,9,12,15]))x = np.arange(20).reshape(5,4)
print(x)
np.random.shuffle(x)
print(x)
[17 11  8 12  9  2 16  7 14  5 15  0  3  1 13 10  4 19 18  6]
None
[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11][12 13 14 15][16 17 18 19]]
[[16 17 18 19][ 0  1  2  3][12 13 14 15][ 4  5  6  7][ 8  9 10 11]]
  • numpy.random.permutation(x) Randomly permute a sequence, or return a permuted range.

If x is a multi-dimensional array,it is only shuffled along its first index.

permutation() 函数的作用与 shuffle() 函数相同,可以打乱第0轴的数据,但是它不会改变原来的数组。

【例】

import numpy as npnp.random.seed(20201124)
x = np.arange(10)
y = np.random.permutation(x)
print(y)print(np.random.permutation([1,4,9,12,15]))x = np.arange(20).reshape((5,4))
print(x)y = np.random.permutation(x)
print(y)
[0 5 3 1 9 4 8 2 6 7]
[15  4 12  9  1]
[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11][12 13 14 15][16 17 18 19]]
[[16 17 18 19][ 8  9 10 11][ 0  1  2  3][12 13 14 15][ 4  5  6  7]]
x
array([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19]])

numpy随机抽样及各种分布函数详解相关推荐

  1. python中tile的用法_python3中numpy函数tile的用法详解

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...

  2. 三位数组的轴python_关于numpy数组轴的使用详解

    概述 按照图一中aixs=0,对aixs=0上下对应的数据进行相加在学习numpy的时候,最难理解的就是轴的概念,我们知道坐标系中有轴的概念,那么两个轴是否有关联呢?为了便于理解,特写此博客进行梳理. ...

  3. numpy之linspace()函数使用详解

    numpy之linspace()函数使用详解 linspace() 函数 作为序列生成器, numpy.linspace()函数用于在线性空间中以均匀步长生成数字序列. Numpy通常可以使用nump ...

  4. python numpy dtype object_关于Numpy数据类型对象(dtype)使用详解

    常用方法 #记住引入numpy时要是用别名np,则所有的numpy字样都要替换 #查询数值类型 >>>type(float) dtype('float64') # 查询字符代码 &g ...

  5. 数据分析:numpy和pandas基础操作详解

    数据处理基础 numpy基础 1.numpy创建数组及基础属性 2.数组的特点 3.创建常见数组 4.数组数据类型 5.生成随机数 6.一维数组索引 7.布尔索引 8. 多维数组的索引 9.实际问题 ...

  6. numpy中的随机数函数详解

    作者学习中积累总结内容,转载请注明 np.random.* numpy随机数 一.生成器 二.简单随机数 三.分布随机数 四.排列 shuffle() permutation() choice() n ...

  7. python中cumsum_python numpy中cumsum的用法详解

    Cumsum :计算轴向元素累加和,返回由中间结果组成的数组 重点就是返回值是"由中间结果组成的数组" 以下代码在python3.6版本运行成功! 下面看代码,定义一个2*2*3的 ...

  8. NumPy之:结构化数组详解

    文章目录 简介 结构化数组中的字段field 结构化数据类型 创建结构化数据类型 从元组创建 从逗号分割的dtype创建 从字典创建 操作结构化数据类型 Offsets 和Alignment Fiel ...

  9. numpy函数:[6]arange()详解

    arange函数用于创建等差数组,使用频率非常高,arange非常类似range函数,会python的人肯定经常用range函数,比如在for循环中,几乎都用到了range,下面我们通过range来学 ...

  10. [转载] Python之Numpy模块中的方法详解

    参考链接: Python中的numpy.diag_indices Numpy(Numerical Python)是科学计算基础库,提供大量科学计算相关功能,比如数据统计,随机数生成等,其提供最核心类型 ...

最新文章

  1. HLS协议及java切片相关
  2. 在Debian/Ubuntu上面安装升级nginx到最新版
  3. qt中初始化界面的几种方法
  4. python try catch 能知道是哪一行代码_能导致3.7亿美元损失的异常,到底是怎么回事?...
  5. 安卓App的启动过程、安卓布局分类及布局和页面的关系
  6. 2012-01-17-05
  7. clob存base64文件存不进去_工行信用卡这几个提额方法,你知道吗?一般人我不告诉他!...
  8. 10-2 使用Channel等待任务结束
  9. 小程序接入h5页面_原生小程序接入H5页面,请求后台接口,获取数据
  10. iis url重写 域名跳转子目录_IIS设置URL重写,实现页面的跳转的重定向方法
  11. python seaborn_Python数据分析之Seaborn(回归分析绘图)
  12. arcgis中给属性文件加x y坐标
  13. WPF使用PictureBox
  14. QQ空间自动点赞代码
  15. 互动大屏,unity透明视频的实现方法:
  16. AngularJS - uib-datepicker-popup - 日期控件
  17. 激光导航AGV最常见的控制算法有哪些?
  18. 外贸业务员询盘处理方法技巧 Google开发客户方法找网址和邮箱
  19. 猜数字游戏(c语言实现)
  20. Sketch52 52.1 新功能介绍(包含下载链接)

热门文章

  1. POJ 3345 Bribing FIPA(树形dp+背包)
  2. 如何压缩图片大小不改变清晰度?怎样一键压缩图片?
  3. 线性代数学习笔记——第二十四讲——向量及其线性运算
  4. 网页游戏服务器端开发心得
  5. oppo 手机计算机历史记录,粘贴板历史记录
  6. 定量变量和定性变量的转换(Transform of Quantitative Qualitative Variables)
  7. 数据结构之数组的存储
  8. 有比鸿蒙还强的境界吗,《庄子》鸿蒙问道:看似愚昧,实则为大境界
  9. 电脑卸载了bandzip,但是在文件的打开方式里面还是有bandzip,注册表里又搜不到相关文件,如何解决?
  10. css2仿微信导航栏-滑动门