zoukankan      html  css  js  c++  java
  • 利用python 学习数据分析 (学习二)

    内容学习自:

    Python for Data Analysis, 2nd Edition        

    就是这本

    纯英文学的很累,对不对取决于百度翻译了

    前情提要:

    各种方法贴:

      https://www.cnblogs.com/baili-luoyun/p/10250177.html

        本内容主要讲的是:

          继续数组和矢量

       一:花式索引

          定义:花式索引指的是利用整数进行索引,

          假设我们有一个 8 *4的数组

    arr = np.empty([8,4])
    print(arr)#传入的元祖或者列表
    for i in range(8):
        arr[i] =i
    print(arr)
    >>>>>

    [[4.67296746e-307 1.69121096e-306 1.29061074e-306 1.69119873e-306]
    [1.78019082e-306 3.56043054e-307 7.56595733e-307 1.60216183e-306]
    [8.45596650e-307 1.86918699e-306 1.78020169e-306 6.23054633e-307]
    [1.95821439e-306 8.01097889e-307 1.78020169e-306 7.56601165e-307]
    [1.02359984e-306 1.29060531e-306 1.24611741e-306 1.11261027e-306]
    [7.56591659e-307 1.33511290e-306 6.89804133e-307 1.20160711e-306]
    [6.89806849e-307 8.34446411e-308 1.22383391e-307 1.33511562e-306]
    [1.42410974e-306 1.00132228e-307 1.33511969e-306 2.18568966e-312]]

    >>>>> 赋值转换成这个

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

          然后我拿 [3,4,5,4] 行

    arr1 =arr[[3,4,5,4]]
    print(arr1)
    >>>>>
    [[0. 0. 0. 0.]
     [1. 1. 1. 1.]
     [2. 2. 2. 2.]
     [3. 3. 3. 3.]
     [4. 4. 4. 4.]
     [5. 5. 5. 5.]
     [6. 6. 6. 6.]
     [7. 7. 7. 7.]]
    
    >>>>                 [3,4,5,4]      拿3  4  5  4 行
    [[3. 3. 3. 3.]
     [4. 4. 4. 4.]
     [5. 5. 5. 5.]
     [4. 4. 4. 4.]]

          可以按照索引倒着拿  这次我拿 -1  -2  -3

    arr2 =arr[[-1,-2,-3]]
    print(arr2)
    
    >>>>>>>>>>>>
    
    
    [[0. 0. 0. 0.]
     [1. 1. 1. 1.]
     [2. 2. 2. 2.]
     [3. 3. 3. 3.]
     [4. 4. 4. 4.]
     [5. 5. 5. 5.]
     [6. 6. 6. 6.]
     [7. 7. 7. 7.]]
    
    
    >>>>>>>>>>
    
    
    [[7. 7. 7. 7.]
     [6. 6. 6. 6.]
     [5. 5. 5. 5.]]

           多维数组中拿到具体某行某列中的值

           :>1 索引

          :拿第1 ,4,3,2 行之后 ,拿第一行的0索引,第4行的第4个索引....

    arr1 =np.arange(1,31).reshape(6,5)      #指定范围1,31 内的  以6行5列显示
    l1 =arr1[[1,4,3,2],[0,4,3,4]]
    print(arr1)
    print(l1)

    >>>>>>

    [[ 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]]

    >>>>>>>>
    [ 6 25 19 15]

             >2:切片

            

    arr1 =np.arange(1,31).reshape(6,5)      #指定范围1,31 内的  以6行5列显示
    # l1 =arr1[[1,4,3,2],[0,4,3,4]]
    print(arr1)
    # print(l1)
    l0 =arr1[[1,4,3,2]]
    print(l0)
    l1 =arr1[[1,4,3,2]][1:3,[0,3]]
    print(l1)

       二:数组转置和轴的转换

          1转置

            

    arr = np.arange(1,16).reshape((3,5))
    print(arr)
    arr1 =arr.T                #把数组倒过来
    print(arr1)
    >>>>>
    
    
    [[ 1  2  3  4  5]
     [ 6  7  8  9 10]
     [11 12 13 14 15]]
    
    >>>>>>>>>>
    
    [[ 1  6 11]
     [ 2  7 12]
     [ 3  8 13]
     [ 4  9 14]
     [ 5 10 15]]



    arr = np.arange(1,17).reshape((2,2,4))
    print(arr)
    arr2 =arr.T #横纵轴转换
    print(arr2)


    >>>>>>>

    [[[ 1 2 3 4]
    [ 5 6 7 8]]

    [[ 9 10 11 12]
    [13 14 15 16]]]

    >>>>>>>>>

    [[[ 1 9]
    [ 5 13]]

    [[ 2 10]
    [ 6 14]]

    [[ 3 11]
    [ 7 15]]

    [[ 4 12]
    [ 8 16]]]

      

          2:矩阵的内积

    arr =np.random.randn(6,3)   # 随机获取一个 3 * 3 的矩阵
    print(arr)
    arr1 =np.dot(arr.T,arr)       #计算的内积
    print(arr1)
    >>>>>>>

    [[-0.66062779 1.87683694 0.61244884]
    [-0.05513691 -2.12443656 0.11384968]
    [ 0.28945781 0.61337207 -0.1571619 ]
    [-1.93240857 0.22642959 0.25642096]
    [-0.34908123 0.53824799 1.59499567]
    [ 0.12419976 1.16825608 -0.29790289]]

    >>>>>>>>>>>>
    [[ 4.39474115 -1.42556005 -1.54566235]
    [-1.42556005 10.11777641 1.3797391 ]
    [-1.54566235 1.3797391 3.11126421]]

          3:矩阵的换行,转置

    np.tranpose函数 的具体方法

    https://blog.csdn.net/xiongchengluo1129/article/details/79017142

    arr = np.arange(1,17).reshape((2,2,4))
    print(arr)
    arr1 =arr.transpose((1,0,2))      
    print(arr1)
    l2 =arr.shape
    print(l2)

    >>
    (2, 2, 4)

    [[[ 1 2 3 4]
    [ 5 6 7 8]]

    [[ 9 10 11 12]
    [13 14 15 16]]]

    >>>>>>>
    [[[ 1 2 3 4]
    [ 9 10 11 12]]

    [[ 5 6 7 8]
    [13 14 15 16]]]

    np.swapaxes()   转置函数

    https://www.cnblogs.com/sunshinewang/p/6893503.html    

    arr2 =arr.swapaxes(1,2)
    print(arr2)

    >>>>>>

    [[[ 1 2 3 4]
    [ 5 6 7 8]]

    [[ 9 10 11 12]
    [13 14 15 16]]]

    [[[ 1 5]
    [ 2 6]
    [ 3 7]
    [ 4 8]]

    [[ 9 13]
    [10 14]
    [11 15]
    [12 16]]]

         三:直接调用函数进行运算

          常用方法演示

          1>开平方

    arr =np.arange(1,10).reshape((3,3))
    print(arr)
    l1 =np.sqrt(arr)   #开平方
    print(l1)
    
    >>>>
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[1.         1.41421356 1.73205081]
     [2.         2.23606798 2.44948974]
     [2.64575131 2.82842712 3.        ]]

          2>

    arr =np.arange(1,10).reshape((3,3))
    print(arr)
    l2 =np.exp(arr)
    print(l2)
    
    
    >>>>>
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[2.71828183e+00 7.38905610e+00 2.00855369e+01]
     [5.45981500e+01 1.48413159e+02 4.03428793e+02]
     [1.09663316e+03 2.98095799e+03 8.10308393e+03]]

          3> 计算两组元素中最大的元素

            maximun

    arr1 =np.random.random(9).reshape(3,3)
    print(arr1)
    arr2 =np.random.random(9).reshape(3,3)
    print(arr2)
    l =np.maximum(arr1,arr2)
    print(l)
    
    
    >>>>>
    第一组
    [[0.80482431 0.81469155 0.00593739]
     [0.91246624 0.16354438 0.92251584]
     [0.10834283 0.47938184 0.99208569]]
    
    第二组
    [[0.38767246 0.30755364 0.42449632]
     [0.87273132 0.65693774 0.359721  ]
     [0.30002093 0.09380089 0.31326786]]
    
    最大的
    [[0.80482431 0.81469155 0.42449632]
     [0.91246624 0.65693774 0.92251584]
     [0.30002093 0.47938184 0.99208569]]

              

           4:返回小数部分和整数部分

    arr =np.random.randn(5)*5
    print(arr)
    remainder,whole_part =np.modf(arr)
    print(remainder)      #返回小数部分
    print(whole_part)    #返回整数部分
    
    
    >>>>>
    例子
    [3.38825431 3.10743429 0.44134949 0.6804942  5.18949692]
    
    
    小数
    [0.38825431 0.10743429 0.44134949 0.6804942  0.18949692]
    
    整数
    [3. 3. 0. 0. 5.]

     

          四:利用数组进行数据处理

          接收两个一维数组并产生两个二维数组

            

    NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级(甚至更多),尤其是各种数值计算。在后面内容中(见附录A)我将介绍广播,这是一种针对矢量化计算的强大手段。
    arr1 = np.arange(-3,3)     #-3 到3 每0.01 一个产生一维数组
    print(arr1)
    xs ,ys=np.meshgrid(arr1,arr1)     # 接受两个一维数组,并产生两个多维数组
    print(ys)
    print(xs)
    
    >>>>
    
    [-3 -2 -1  0  1  2]
    
    
    
    [[-3 -3 -3 -3 -3 -3]
     [-2 -2 -2 -2 -2 -2]
     [-1 -1 -1 -1 -1 -1]
     [ 0  0  0  0  0  0]
     [ 1  1  1  1  1  1]
     [ 2  2  2  2  2  2]]
    
    
    
    [[-3 -2 -1  0  1  2]
     [-3 -2 -1  0  1  2]
     [-3 -2 -1  0  1  2]
     [-3 -2 -1  0  1  2]
     [-3 -2 -1  0  1  2]
     [-3 -2 -1  0  1  2]]

    利用sqrt 处理后,输出图像

    z =np.sqrt(xs**2+ys **2)
    print(z)
    plt.imshow(z,cmap=plt.cm.gray); plt.colorbar()
    plt.show()
    >>>>>
    [[4.24264069 3.60555128 3.16227766 3.         3.16227766 3.60555128]
     [3.60555128 2.82842712 2.23606798 2.         2.23606798 2.82842712]
     [3.16227766 2.23606798 1.41421356 1.         1.41421356 2.23606798]
     [3.         2.         1.         0.         1.         2.        ]
     [3.16227766 2.23606798 1.41421356 1.         1.41421356 2.23606798]
     [3.60555128 2.82842712 2.23606798 2.         2.23606798 2.82842712]]

          五:将条件逻辑转换为数组运算

            np.where()    #矢量化三元表达式

    xarr =np.array([1.1,1.2,1.3,1.4,1.5])
    yarr =np.array([2.1,2.2,2.3,2.4,2.5])
    cond =np.array([True,False,True,True,False])
    # result =[(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
    # print(result)
    result =np.where(xarr,yarr,cond)
    print(result)
    
    >>>>
    [2.1 2.2 2.3 2.4 2.5]
    arr =np.random.randn(4,4) # 生成一个随机的4x4素组
    print(arr)
    # 让所有的数转化成bool 型
    arr1 =arr>1
    print(arr1)
    # 让所有的正数变成2 ,所有的负数变成-2
    print(np.where(arr>0 ,2,arr))    #第一个是条件,之后是两个参数
    
    
    >>>>
    [[-0.99386972  0.05822068 -0.7181413  -0.12671717]
     [-0.8489312  -1.04778749  1.74556603  0.6705986 ]
     [-0.02260339 -0.41670963 -0.44856615 -0.28767915]
     [ 0.90181549  1.13150798  1.85432972 -0.15670278]]
    [[False False False False]
     [False False  True False]
     [False False False False]
     [False  True  True False]]
    [[-0.99386972  2.         -0.7181413  -0.12671717]
     [-0.8489312  -1.04778749  2.          2.        ]
     [-0.02260339 -0.41670963 -0.44856615 -0.28767915]
     [ 2.          2.          2.         -0.15670278]]

           六:数学和统计方法,以及简单的聚类

            

    arr =np.arange(1,10).reshape(3,3)
    print(arr)
    print(arr.mean(axis=1)) # 求没行的平均值
    print(np.mean(arr)) #求平均值
    print(np.sum(arr))# 求和
    
    >>>>
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [2. 5. 8.]
    5.0
    45

             一维累加

    l =arr.cumsum()        #累加函数    #[ 1  3  6 10 15 21 28]
    print(l)
    
    >>>>
    [ 1  3  6 10 15 21 28 36 45]

            多维累加

    arr1 =np.arange(1,10).reshape(3,3)
    print(arr1)
    arr2 =arr1.cumsum(axis =0)        #0 是第一行不动后面行加上前面行
    arr4 =arr1.cumsum()
    print(arr2)
    # print(arr4)
    arr3 =arr1.cumsum(axis =1)          #1 是第一列不动,后面列加上前面列
    print(arr3)
    >>>>>>>



    [[1 2 3]
    [4 5 6]
    [7 8 9]]
    [[ 1 2 3]
    [ 5 7 9]
    [12 15 18]]
    [[ 1 3 6]
    [ 4 9 15]
    [ 7 15 24]]

          七:排序

            >1:一维数组排序

    # 一维数组
    arr1 =np.random.randn(6)
    print(arr1)
    l1 =arr1.sort()  #排序
    print(arr1)
    
    
    
    >>>>>>>>>>
    原数组
    [-1.26064268  0.66278245  0.0403269   0.04349955 -0.60284353  0.653689  ]
    
    排序后
    
    [-1.26064268 -0.60284353  0.0403269   0.04349955  0.653689    0.66278245]

            2:>多维数组的排序

    arr2 =np.random.randn(3,3)
    
    print(arr2)
    arr2.sort(1)# 排序      可以横向和纵向排序 0纵 1横
    print(arr2)
    
    >>>>
    
    
    [[-0.5662314  -0.47501447  0.03701109]
     [-1.06994683  1.13578476 -0.26945096]
     [-1.09949419 -0.46383867 -0.34989365]]


    [[
    -0.5662314 -0.47501447 0.03701109] [-1.06994683 -0.26945096 1.13578476] [-1.09949419 -0.46383867 -0.34989365]]

          八:唯一化以及其他的集合逻辑

    names =np.array(['bob','joe','will','bob','will','joe','joe'])
    print(np.unique(names))  #获取唯一化
    # 成员资格
    valuse =np.array([1,2,3,4,4,3,2,1])
    print(np.in1d(valuse,[2,3,4]))
    
    
    >>>>>
    ['bob' 'joe' 'will']
    [False  True  True  True  True  True  True False]

        九:线性代数

       

    x = np.array([[1,2],[3,4]])
    y =np.array([[3,4],[1,2]])
    print(x)
    print(y)
    print(np.dot(x,y))     #数组,内积,数组
    
    
    >>>>>
    
    [[1 2]
     [3 4]]
    [[3 4]
     [1 2]]
    [[ 5  8]
     [13 20]]
    from numpy.linalg import inv,qr
    X =np.arange(1,10).reshape(3,3)
    print(X)
    ni =inv(X)
    print(ni)
    mat =np.dot(X,ni)
    print(mat)
    
    >>>>>
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[-4.50359963e+15  9.00719925e+15 -4.50359963e+15]
     [ 9.00719925e+15 -1.80143985e+16  9.00719925e+15]
     [-4.50359963e+15  9.00719925e+15 -4.50359963e+15]]
    [[ 0.  0.  0.]
     [-4.  0.  4.]
     [ 0.  0.  8.]]
  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/baili-luoyun/p/10259303.html
Copyright © 2011-2022 走看看