zoukankan      html  css  js  c++  java
  • numpy 相关统计

     目录

    1.numpy.amin() 计算最小值

    numpy.amin(a[, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue, where=np._NoValue])

    例子如下:

    import numpy as np
    
    x = np.array([[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]])
    #最小值
    y = np.amin(x)#11
    
    #每列最小值
    y = np.amin(x, axis=0)
    print(y)  # [11 12 13 14 15]
    
    #每行最小值
    y = np.amin(x, axis=1)
    print(y)  # [11 16 21 26 31]

    其实直接使用x.min()也是同样的效果

    print(x.min()) #11
    print(x.min(axis=0)) #[11 12 13 14 15]
    print(x.min(axis=1)) #[11 16 21 26 31]

    最大值也是同样的用法,就不赘述了

    2.计算极差(也就是最大值和最小值的差

    numpy.ptp(a, axis=None, out=None, keepdims=np._NoValue)

    例子如下:

    import numpy as np
    
    np.random.seed(20200623)
    x = np.random.randint(0, 20, size=[4, 5])
    print(x)
    # [[10  2  1  1 16]
    #  [18 11 10 14 10]
    #  [11  1  9 18  8]
    #  [16  2  0 15 16]]
    
    #极差
    print(np.ptp(x))  # 18
    
    #计算每列极差
    print(np.ptp(x, axis=0))  # [ 8 10 10 17  8]
    
    #计算每行极差
    print(np.ptp(x, axis=1))  # [15  8 17 16]

    同理,使用x.ptp()也是OK的

    3.计算分位数

    numpy.percentile(a, q, axis=None, out=None, overwrite_input=False, interpolation='linear', keepdims=False)
    • a:array,用来算分位数的对象,可以是多维的数组。
    • q:介于0-100的float,用来计算是几分位的参数,如四分之一位就是25,如要算两个位置的数就[25,75]。
    • axis:坐标轴的方向,一维的就不用考虑了,多维的就用这个调整计算的维度方向,取值范围0/1
    np.random.seed(20200623)
    x = np.random.randint(0, 20, size=[4, 5])
    print(x)
    # [[10  2  1  1 16]
    #  [18 11 10 14 10]
    #  [11  1  9 18  8]
    #  [16  2  0 15 16]]
    
    #如果只求某个分位数,直接使用int,如果是多个,则使用list
    print(np.percentile(x, 25))
    #2.0
    
    print(np.percentile(x, [25, 50]))  
    # [ 2. 10.]
    
    print(np.percentile(x, [25, 50], axis=0))
    # [[10.75  1.75  0.75 10.75  9.5 ]
    #  [13.5   2.    5.   14.5  13.  ]]
    
    print(np.percentile(x, [25, 50], axis=1))
    # [[ 1. 10.  8.  2.]
    #  [ 2. 11.  9. 15.]]

    4.计算中位数

    numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)

    例子,和分位数是50的值是一样的

    import numpy as np
    
    np.random.seed(20200623)
    x = np.random.randint(0, 20, size=[4, 5])
    print(x)
    # [[10  2  1  1 16]
    #  [18 11 10 14 10]
    #  [11  1  9 18  8]
    #  [16  2  0 15 16]]
    print(np.percentile(x, 50))
    print(np.median(x))
    # 10.0
    
    print(np.percentile(x, 50, axis=0))
    print(np.median(x, axis=0))
    # [13.5  2.   5.  14.5 13. ]
    
    print(np.percentile(x, 50, axis=1))
    print(np.median(x, axis=1))
    # [ 2. 11.  9. 15.]

    注意:中位数和分位数都不可以使用x.median() 或者是x.percentile()

    5.计算均值,沿轴的元素的总和除以元素的数量(counts)

    numpy.mean(a[, axis=None, dtype=None, out=None, keepdims=np._NoValue)])

    例子

    import numpy as np
    
    x = np.array([[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]])
    y = np.mean(x)
    print(y)  # 23.0
    
    y = np.mean(x, axis=0)
    print(y)  # [21. 22. 23. 24. 25.]
    
    y = np.mean(x, axis=1)
    print(y)  # [13. 18. 23. 28. 33.]
    
    #是否可以使用x.mean()
    print(x.mean())  #23.0

    我们验证一下分母是否会考虑空值,答案是不可以的

    a=np.array([1,2,3,4,5,np.nan])
    print(a)
    #[ 1.  2.  3.  4.  5. nan] 
    print(a.mean())  #nan
    print(np.mean(a)) #nan
    
    print(a[:-1].mean())  #3.0

    6.计算加权平均值

    numpy.average(a[, axis=None, weights=None, returned=False])

    meanaverage都是计算均值的函数,在不指定权重的时候averagemean是一样的。指定权重后,average可以计算加权平均值

    计算加权平均值(将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。)

    import numpy as np
    
    x = np.array([[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]])
    y = np.average(x)
    print(y)  # 23.0
    
    y = np.average(x, axis=0)
    print(y)  # [21. 22. 23. 24. 25.]
    
    y = np.average(x, axis=1)
    print(y)  # [13. 18. 23. 28. 33.]
    
    
    y = np.arange(1, 26).reshape([5, 5])
    print(y)
    # [[ 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]]
    
    z = np.average(x, weights=y)
    print(z)  # 27.0
    
    z = np.average(x, axis=0, weights=y)
    print(z)
    # [25.54545455 26.16666667 26.84615385 27.57142857 28.33333333]
    
    z = np.average(x, axis=1, weights=y)
    print(z)
    # [13.66666667 18.25       23.15384615 28.11111111 33.08695652]

    第一行的均值怎么的来的:

    sum(x[0]*y[0]/y[0].sum()) #13.666666666666668

    也就是说分母其实就是y的求和,而mean的分母是个数

    7.计算方差

    numpy.var(a[, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue])

    ddof=0:是“Delta Degrees of Freedom”,表示自由度的个数

    要注意方差和样本方差的无偏估计,方差公式中分母上是n;样本方差无偏估计公式中分母上是n-1n为样本个数),证明的链接

    import numpy as np
    
    x = np.array([[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]])
    y = np.var(x)
    print(y)  # 52.0
    y = np.mean((x - np.mean(x)) ** 2)
    print(y)  # 52.0
    
    y = np.var(x, ddof=1)
    print(y)  # 54.166666666666664
    y = np.sum((x - np.mean(x)) ** 2) / (x.size - 1)
    print(y)  # 54.166666666666664
    
    y = np.var(x, axis=0)
    print(y)  # [50. 50. 50. 50. 50.]
    
    y = np.var(x, axis=1)
    print(y)  # [2. 2. 2. 2. 2.]
    
    print(x.var())

    8.计算标准差

    numpy.std(a[, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue])

    标准差是一组数据平均值分散程度的一种度量,是方差的算术平方根

    import numpy as np
    
    x = np.array([[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]])
    y = np.std(x)
    print(y)  # 7.211102550927978
    y = np.sqrt(np.var(x))
    print(y)  # 7.211102550927978
    
    y = np.std(x, axis=0)
    print(y)
    # [7.07106781 7.07106781 7.07106781 7.07106781 7.07106781]
    
    y = np.std(x, axis=1)
    print(y)
    # [1.41421356 1.41421356 1.41421356 1.41421356 1.41421356]

    9.计算协方差矩阵

    numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None,aweights=None)

    注意:

          cov(x,0) = cov(x) =var(x)   都是计算 一维序列 x 的方差 (样本方差)    

          cov(X,Y)   计算两个一维序列 X,Y的协方差(也可以是 矩阵)。必须是各维数都相同

          cov(X,1)     除以N而不是N-1  (方差)                        

          cov(X,Y,1)   除以N而不是N-1

    可以理解为,对角线的是各自的样本方差,反对角线是这两个样本方差相乘再开方

    例子

    import numpy as np
    
    x = [1, 2, 3, 4, 6]
    y = [0, 2, 5, 6, 7]
    print(np.cov(x))  # 3.7   #样本方差
    print(np.cov(y))  # 8.5   #样本方差
    print(np.cov(x, y))
    # [[3.7  5.25]
    #  [5.25 8.5 ]]
    
    print(np.var(x))  # 2.96    #方差
    print(np.var(x, ddof=1))  # 3.7    #样本方差
    print(np.var(y))  # 6.8    #方差
    print(np.var(y, ddof=1))  # 8.5    #样本方差
    
    z = np.mean((x - np.mean(x)) * (y - np.mean(y)))    #协方差
    print(z)  # 4.2
    
    z = np.sum((x - np.mean(x)) * (y - np.mean(y))) / (len(x) - 1)   #样本协方差
    print(z)  # 5.25
    
    z = np.dot(x - np.mean(x), y - np.mean(y)) / (len(x) - 1)     #样本协方差     
    print(z)  # 5.25

    10.计算相关系数

    numpy.corrcoef(x, y=None, rowvar=True, bias=np._NoValue, ddof=np._NoValue)

    理解了np.cov()函数之后,很容易理解np.correlate(),二者参数几乎一模一样。

    np.cov()描述的是两个向量协同变化的程度,它的取值可能非常大,也可能非常小,这就导致没法直观地衡量二者协同变化的程度。相关系数实际上是正则化的协方差,n个变量的相关系数形成一个n维方阵

    import numpy as np
    
    np.random.seed(20200623)
    x, y = np.random.randint(0, 20, size=(2, 4))
    
    print(x)  # [10  2  1  1]
    print(y)  # [16 18 11 10]
    
    z = np.corrcoef(x, y)
    print(z)
    # [[1.         0.48510096]
    #  [0.48510096 1.        ]]
    
    a = np.dot(x - np.mean(x), y - np.mean(y))
    b = np.sqrt(np.dot(x - np.mean(x), x - np.mean(x)))
    c = np.sqrt(np.dot(y - np.mean(y), y - np.mean(y)))
    print(a / (b * c))  # 0.4851009629263671

    11.直方图

    numpy.digitize(x, bins, right=False)
    • x:numpy数组
    • bins:一维单调数组,必须是升序或者降序
    • right:间隔是否包含最右
    • 返回值:x在bins中的位置
    import numpy as np
    
    x = np.array([0.2, 6.4, 3.0, 1.6])
    bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])
    inds = np.digitize(x, bins)
    print(inds)  # [1 4 3 2]
    for n in range(x.size):
        print(bins[inds[n] - 1], "<=", x[n], "<", bins[inds[n]])
    
    # 0.0 <= 0.2 < 1.0
    # 4.0 <= 6.4 < 10.0
    # 2.5 <= 3.0 < 4.0
    # 1.0 <= 1.6 < 2.5
    
    
    import numpy as np
    
    x = np.array([1.2, 10.0, 12.4, 15.5, 20.])
    bins = np.array([0, 5, 10, 15, 20])
    inds = np.digitize(x, bins, right=True)
    print(inds)  # [1 2 3 4 4]
    
    inds = np.digitize(x, bins, right=False)
    print(inds)  # [1 3 3 4 5]
  • 相关阅读:
    解决MAMP启动mysql服务 但是Navicat连接不上
    iOS 更改状态栏颜色和隐藏状态栏
    Xcode 常用代码段
    iOS开发小技巧
    怎么让self.view的Y从navigationBar下面开始计算
    iOS强制横屏或强制竖屏
    判断当前viewcontroller是push还是present的方式显示的
    Git命令速查表
    全栈程序员的新玩具Rust(一) IDE环境
    火狐的野望
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/14052574.html
Copyright © 2011-2022 走看看