zoukankan      html  css  js  c++  java
  • 数据分析之numpy

    Numpy的使用

    一:Numpy数组的创建

    1) 使用np来生成一个有序的一维数组

    ls1=np.arange(10)

    ls1

    输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

    2)通过数组创建np数组

    arr1=np.array([1,10,5,2,30,20])

    arr1

    输出:array([ 1, 10, 5, 2, 30, 20])

    通过元组创建np数组
    arr3=np.array(((1,1,1,1,2),(2,2,2,2,2)))

    arr3

    输出:array([[1, 1, 1, 1, 2], [2, 2, 2, 2, 2]])

    4)创建空数组

    np.empty(3)
    输出:array([0., 0., 0.])
    二:二维及多维数组的创建

    二维数组的创建

    1)元组套元组

    arr3=np.array(((1,1,1,1,2),(2,2,2,2,2)))

    arr3

    输出:array([[1, 1, 1, 1, 2], [2, 2, 2, 2, 2]])

    创建全一数组

    np.ones(3)
    输出:array([1., 1., 1.])
    创建全零数组:

    np.zeros(3)

    输出:array([0., 0., 0.])
    创建元素全为一的3*4的二维数组

    np.ones([3,4]

    输出:
    array([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]])
    创建元素全为零的3*4全零数组

    np.zeros([3,4])

    输出:array([[0., 0., 0., 0.],
    [0., 0., 0., 0.],
    [0., 0., 0., 0.]])
    查看数组的形状:

    arr.shape
    查看数组的数据类型:

    arr.dtype
    将多维数组展开:

    例:arr5=np.empty([3,4])

    arr5
    
    输出:array([[1.03156124e-311, 3.16202013e-322, 0.00000000e+000,
    0.00000000e+000],
    

    [0.00000000e+000, 9.68744731e-071, 1.69184165e-052,
    8.77838469e-071],
    [4.98778453e-037, 6.40440036e+170, 1.33532526e+165,
    1.61997615e-051]])

    对arr5数组展开,即降维
    
    arr6=arr5.ravel()  #降维
    arr6
    
    输出:
    array([1.03156124e-311, 3.16202013e-322, 0.00000000e+000, 0.00000000e+000,
    

    0.00000000e+000, 9.68744731e-071, 1.69184165e-052, 8.77838469e-071,
    4.98778453e-037, 6.40440036e+170, 1.33532526e+165, 1.61997615e-051])
    使用flatten函数可以实现相同的效果

    arr7=arr5.flatten()

    arr7

    输出:

    array([1.03156124e-311, 3.16202013e-322, 0.00000000e+000, 0.00000000e+000,
    0.00000000e+000, 9.68744731e-071, 1.69184165e-052, 8.77838469e-071,
    4.98778453e-037, 6.40440036e+170, 1.33532526e+165, 1.61997615e-051])
    返回数组的维数:

    arr.ndim
    返回数组中元素的个数

    arr.size
    返回数组转置的结果

    arr.T

    数组的级联

    arr8=np.zeros([3,4])
    arr9=np.ones([3,4])
    水平级联

    水平级联的行数必须相同

    np.hstack((arr8,arr9))
    
    输出:
        
        array([[0., 0., 0., 0., 1., 1., 1., 1.],
    

    [0., 0., 0., 0., 1., 1., 1., 1.],
    [0., 0., 0., 0., 1., 1., 1., 1.]])
    纵向级联

    纵向级联的列数必须相同

    np.vstack((arr8,arr9))
    
    输出:
        
        array([[0., 0., 0., 0.],
    

    [0., 0., 0., 0.],
    [0., 0., 0., 0.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]])

    水平连接:
    与水平级联效果相同
    np.column_stack((arr8,arr9))
    输出:
    array([[0., 0., 0., 0., 1., 1., 1., 1.],
    [0., 0., 0., 0., 1., 1., 1., 1.],
    [0., 0., 0., 0., 1., 1., 1., 1.]])

    纵向连接:
        纵向连接与纵向级联的效果相同
        arr11=np.row_stack((arr8,arr9))
        arr11
        输出:
            array([[0., 0., 0., 0.],
                   [0., 0., 0., 0.],
                   [0., 0., 0., 0.],
                   [1., 1., 1., 1.],
                   [1., 1., 1., 1.],
                   [1., 1., 1., 1.]])
    

    形状重置:

    arr12=arr11.reshape(4,6)
    arr12

    输出:
    array([[0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0.],
    [1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1.]])

    使用reshape对形状的改变并不会影响原数组

    如果想要改变原有数组的形状,可以使用resize()函数

    arr11.resize(4,6)
    arr11
    输出:
    array([[0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0.],
    [1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1.]])
    将ndArray数组转为list

    data=arr11.tolist()

    type(data)

    输出:
    list
    data
    输出:
    [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
    [1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
    [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
    将list转为ndArray:

    data1=np.array(data)

    type(data1)
    输出:
    numpy.ndarray
    data1
    输出:
    array([[0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0.],
    [1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1.]])
    数据类型转换:

    arr11.astype(int)
    输出:
    array([[0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1]])
    数组元素的获取:

    data2=np.array(np.arange(10))
    data2
    输出:
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    以下标方式获取元素:
    data2[3]
    输出:
    3
    获取前三个元素
    data2[:3]
    输出:
    array([0, 1, 2])
    获取第四个元素后的所有元素
    data2[3:]
    输出:
    array([3, 4, 5, 6, 7, 8, 9])

    获取最后两位:
        data2[-2:]
        输出:
            array([8, 9])
    
    步长为2取数
        data2[::2]
        输出:
            array([0, 2, 4, 6, 8])
    建立一个3*4的数组
    arr8=np.array(np.arange(12)).reshape(3,4)
    arr8
    输出:
        array([[ 0,  1,  2,  3],
               [ 4,  5,  6,  7],
               [ 8,  9, 10, 11]])
    #取前两行前两列的数据
    arr8[:2,:2]
    输出:
        array([[0, 1],
                [4, 5]])
    
    获取第一行的数据
    arr8[0]
    输出:
        array([0, 1, 2, 3])
    获取前两行前两列的数据
    arr8[:2,:2]
    输出:
        array([[0, 1],
            [4, 5]])
            
    获取第一行与第三行
    arr8[[0,2]]
    输出:
        array([[ 0,  1,  2,  3],
                [ 8,  9, 10, 11]])
    
    
    获取所有行的第一列
        arr8[:,0]
        输出:
            array([0, 4, 8])
    获取所有行最后两列
        arr8[:,-2:]
        输出:
            array([[ 2,  3],
                   [ 6,  7],
                   [10, 11]])
                   
                   
    获取所有行的第一列和第三列的数据
    
        arr8[:,[0,2]]
        输出:
            array([[ 0,  2],
                   [ 4,  6],
                   [ 8, 10]])
                   
    获取第二行第三列的数据    
        
        arr8[1,2]
        
        输出:6
    

    布尔索引:

    log=np.array([True,False,False,True,True,False])
    arr9=np.array(np.arange(24)).reshape(6,4)
    arr9
    输出:
    array([[ 0, 1, 2, 3],
    [ 4, 5, 6, 7],
    [ 8, 9, 10, 11],
    [12, 13, 14, 15],
    [16, 17, 18, 19],
    [20, 21, 22, 23]])
    获取所有为true的对应的行

    arr9[log]

    输出:
    array([[ 0, 1, 2, 3],
    [12, 13, 14, 15],
    [16, 17, 18, 19]])
    返回所有为False对应的行

    arr9[~log]

    输出:
    array([[ 4, 5, 6, 7],
    [ 8, 9, 10, 11],
    [20, 21, 22, 23]])

    案例:
    生成一个包含有七个元素的一维数组
    area=np.array(['A','B','A','C','A','B','D'])
    area
    输出:
    array(['A', 'B', 'A', 'C', 'A', 'B', 'D'], dtype='<U1')
    生成一个7*3的二维数组

    observes=np.array(np.arange(21)).reshape(7,3)
    observes
    输出:
    array([[ 0, 1, 2],
    [ 3, 4, 5],
    [ 6, 7, 8],
    [ 9, 10, 11],
    [12, 13, 14],
    [15, 16, 17],
    [18, 19, 20]])
    在area中,A出现的索引位置为0,2,4,通过A的索引获取observes对应索引行的数据:

    observes[area=='A']
    输出:
    array([[ 0, 1, 2],
    [ 6, 7, 8],
    [12, 13, 14]])
    通过c在area中的索引位置来获取observes对应行的数据

    observes[area=='C']

        输出:
            array([[ 9, 10, 11]])
    

    通过a和d在area中的索引位置来获取observes对应行的数据

    observes[(area'A') |(area'D')]
    输出:
    array([[ 0, 1, 2],
    [ 6, 7, 8],
    [12, 13, 14],
    [18, 19, 20]])

    返回A区域的所有行,且只获取第1列与第3列数据

    observes[area=='A'][:,[0,2]]
    输出:
    array([[ 0, 2],
    [ 6, 8],
    [12, 14]])
    花式索引:

    实际上就是将数组作为索引将原数组的元素提取出来

    arr10=np.arange(1,29).reshape(7,4)
    arr10
    输出:
        array([[ 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]])
    

    将第二行,第四行,第六行,第七行数据返回
    arr10[1,3,5,6]
    输出:
    array([[ 5, 6, 7, 8],
    [13, 14, 15, 16],
    [21, 22, 23, 24],
    [25, 26, 27, 28]])
    返回第二行第三行对应的第二列与第三列:

    arr10[[1,2]][:,[1,2]]
    输出:
    array([[ 6, 7],
    [10, 11]])
    如果想使用比较简单的方式返回指定行以列的二维数组的话,可以使用ix_()函数

    返回第一行後三行,第四行的第一列第四列与第二列

        arr10[np.ix_([0,2,3],[0,3,2])]
        
        输出:
            array([[ 1,  4,  3],
                   [ 9, 12, 11],
                   [13, 16, 15]])
    

    统计函数与线性代数运算

    统计运算中常见的聚合函数有:最小值、最大值、中位数、均值、方差、标准差等。首先来看看数组元素级别的计算:

     arr11=5-np.arange(1,13).reshape(4,3)
     arr11
     
     输出:
        array([[ 4,  3,  2],
               [ 1,  0, -1],
               [-2, -3, -4],
               [-5, -6, -7]])
               
    arr12=np.random.randint(1,10,size=12).reshape(4,3)
    arr12
    输出:
        array([[9, 7, 2],
               [1, 1, 8],
               [7, 8, 8],
               [2, 8, 9]])
               
    arr13=arr11**2
    arr13
    输出:
        array([[4., 3., 2.],
               [1., 0., 1.],
               [2., 3., 4.],
               [5., 6., 7.]])
    
    #计算arr13中每个元素的平方根
    np.sqrt(arr13)
    输出:
        array([[4., 3., 2.],
               [1., 0., 1.],
               [2., 3., 4.],
               [5., 6., 7.]])
    
    计算arr13中每个元素的指数值
    
        np.exp(arr13)
        
        输出:
            array([[8.88611052e+06, 8.10308393e+03, 5.45981500e+01],
                   [2.71828183e+00, 1.00000000e+00, 2.71828183e+00],
                   [5.45981500e+01, 8.10308393e+03, 8.88611052e+06],
                   [7.20048993e+10, 4.31123155e+15, 1.90734657e+21]])
    

    计算arr13中每个元素的自然对数值
    np.log(arr13)

    输出:
          array([[2.77258872, 2.19722458, 1.38629436],
           [0.        ,       -inf, 0.        ],
           [1.38629436, 2.19722458, 2.77258872],
           [3.21887582, 3.58351894, 3.8918203 ]])
    

    计算每个元素的绝对值

    np.abs(arr13)
    

    整除

    arr11//2
    
    输出:
        array([[ 2,  1,  1],
               [ 0,  0, -1],
               [-1, -2, -2],
               [-3, -3, -4]], dtype=int32)
    

    取余数

    arr11%3
    输出:
        array([[1, 0, 2],
               [1, 0, 2],
               [1, 0, 2],
               [1, 0, 2]], dtype=int32)
    

    统计运算函数

    计算所有元素之和
    np.sum(arr11)
    输出:
    -18
    对每一列求和

    np.sum(arr11,axis=0)

    输出:
        array([ -2,  -6, -10])
    

    形状相同的数组间元素操作

    arr11+arr12
    输出:
    array([[ 6, 9, 4],
    [ 7, 5, 7],
    [ 1, 6, 3],
    [ 2, 0, -4]])

    arr11*arr12

    输出:
    array([[ 8, 18, 4],
    [ 6, 0, -8],
    [ -6, -27, -28],
    [-35, -36, -21]])

    整除

    arr11//arr12
    输出:
        array([[ 2,  0,  1],
               [ 0,  0, -1],
               [-1, -1, -1],
               [-1, -1, -3]], dtype=int32)
    

    除arr11/arr12

    arr11/arr12
    
    输出:    
        array([[ 2.        ,  0.5       ,  1.        ],
       [ 0.16666667,  0.        , -0.125     ],
       [-0.66666667, -0.33333333, -0.57142857],
       [-0.71428571, -1.        , -2.33333333]])
    

    取余

    arr11%arr12
    
    输出:
        array([[0, 3, 0],
               [1, 0, 7],
               [1, 6, 3],
               [2, 0, 2]], dtype=int32)
    

    对所有元素求和
    np.sum(arr11)

    输出:
        -18
    

    对每一列求和

    np.sum(arr11,axis=0)
    输出:
    array([ -2, -6, -10])
    对每一行求和

    np.sum(arr11,axis=1)
    输出:
    array([ 9, 0, -9, -18])
    求每一列的累积和,并返回二维数组

    np.cumsum(arr11,axis=0)
    输出:
    array([[ 4, 3, 2],
    [ 5, 3, 1],
    [ 3, 0, -3],
    [ -2, -6, -10]], dtype=int32)
    计算每一列的累计积

    np.cumprod(arr11,axis=1)
    输出:
    array([[ 4, 12, 24],
    [ 1, 0, 0],
    [ -2, 6, -24],
    [ -5, 30, -210]], dtype=int32)
    计算所有元素中的最小值

    np.min(arr11)

    输出:
    

    -7

    计算所有元素中的最大值
    np.max(arr11)

    输出:
        4
    

    计算每一列的最大值

    np.max(arr11,axis=0)

    输出:
    array([4, 3, 2])
    计算每一行的最大值

    np.max(arr11,axis=1)
    输出:
    array([ 4, 1, -2, -5])
    计算所有元素的平均值

    np.mean(arr11)
    计算每一列的均值

    np.mean(arr11,axis=0)
    计算每一行的均值

    np.mean(arr11,axis=1)
    计算所有元素的中位数

    np.median(arr11)
    计算所有元素方差

    np.var(arr11)
    np.where

    np.where(condition, x, y)

    满足条件(condition),输出x,不满足输出y。
    arr11
    输出:
    array([[ 4, 3, 2],
    [ 1, 0, -1],
    [-2, -3, -4],
    [-5, -6, -7]])
    np.where(arr11<0,'小于零','大于零')
    输出:
    array([['大于零', '大于零', '大于零'],
    ['大于零', '大于零', '小于零'],
    ['小于零', '小于零', '小于零'],
    ['小于零', '小于零', '小于零']], dtype='<U3')
    np.where(condition):

    只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。这里的坐标以tuple的形式给出, #通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。

    a=np.array([2,4,6,8,10])
    返回a中大于5的元素索引
    np.where(a>5)
    输出:
    (array([2, 3, 4], dtype=int64),)
    返回a中大于5的元素
    a[np.where(a>5)]
    输出:
    array([ 6, 8, 10])
    其它函数:

    np.unique( )的用法 该函数是去除数组中的重复数字,并进行排序之后输出。
    np.unique([1,1,2,3,4])

    输出:
    array([1, 2, 3, 4])
    intersect1d(x,y):计算x和y的公共元素,即交集

    x=np.array([1,2,3,4,5]) y=np.array([4,5,6,7,8]) 取x,y的交集 np.intersect1d(x,y)

    输出:array([4, 5])
    union1d(x,y):计算x和y的并集

    np.union1d(x,y)
    输出:
    array([1, 2, 3, 4, 5, 6, 7, 8])
    setdiff1d(x,y):计算x和y的差集,即元素在x中,不在y中

    np.setdiff1d(x,y)
    输出:
    array([1, 2, 3])
    setxor1d(x,y):计算集合的对称差,即存在于一个数组中,但不同时存在于两个数组中

    np.setxor1d(x,y)
    输出:
    array([1, 2, 3, 6, 7, 8])
    in1d(x,y):判断x的元素是否包含于y中

    np.inld(x,y)
    输出:
    array([False, False, False, True, True])
    找出x在y中的元素

    x[np.inld(x,y)]
    输出:
    array([4, 5])

  • 相关阅读:
    [转载]游戏外挂原理
    python cookbook
    RF user guide
    测试理论-selenium的工作原理
    测试理论- the conten of test plan
    测试理论--branch testing and boundary testing
    测试理论--向高级出发
    fiddler安装及配置
    python 面试题: 列表表达式
    [redis]如何将redis设置成diango的cache backend
  • 原文地址:https://www.cnblogs.com/lijintian/p/11663002.html
Copyright © 2011-2022 走看看