zoukankan      html  css  js  c++  java
  • 利用python进行数据分析1_numpy的基本操作,建模基础

    import numpy as np
    # 生成指定维度的随机多维数据
    data=np.random.rand(2,3)
    print(data)
    print(type(data))
    

       结果:

    [[0.11959428 0.52816495 0.31736705]
     [0.75400637 0.26683732 0.54080784]]
    <class 'numpy.ndarray'>
    View Code
    print('维度个数',data.ndim)
    print('各维度大小',data.shape)
    print('数据类型',data.dtype)
    

        结果:

    维度个数 2
    各维度大小 (2, 3)
    数据类型 float64
    View Code

    补充:

    import numpy as np
    # 生成指定维度的随机多维数据
    data2=np.arange(1,10,2)#间隔为2
    print(data2)
    print('元素个数',data2.size)   # 5
    

    ndarray,N维数组对象(矩阵)

    所有元素必须是相同类型     ndim属性:维度个数   shape属性:各维度大小  dtype属性:数据类型 

    创建ndarray

    #list转换为ndarray
    l=range(10)
    data=np.array(l)
    print(data)#[0 1 2 3 4 5 6 7 8 9]
    print(data.shape)#(10,)
    print(data.ndim)#1
    

      

    #嵌套序列转换为ndarray
    l2=[range(10),range(10)]
    data=np.array(l2)
    print(data.shape)#(2,10)
    
    print(data)
    #[[0 1 2 3 4 5 6 7 8 9]
     #[0 1 2 3 4 5 6 7 8 9]]
    
    np.zeros,Np.ones和np.empty
    #np.zeros
    np.zeros((3,4))
    
    #array([[0., 0., 0., 0.],
    #        [0., 0., 0., 0.],
    #        [0., 0., 0., 0.]])
    #np.ones
    np.ones((2,3)) 
    
    # array([[1., 1., 1.],
    #        [1., 1., 1.]])
    

      

    #np.empty
    np.empty((3,3))
    
    # array([[3.8043055e-322, 0.0000000e+000, 0.0000000e+000],
    #        [0.0000000e+000, 0.0000000e+000, 3.6560858e-321],
    #        [0.0000000e+000, 0.0000000e+000, 2.5706196e-316]])
    

      

    #np.empty 指定数据类型
    empty_int_arr=np.empty((3,3),int)
    empty_int_arr
    
    # array([[  45023345,          0, -301822228],
    #        [       127, -534188352,       2046],
    #        [        36,          0,          2]])
    

    总结: np.zeros,Np.ones和np.empty指定大小的全0或全1数组    注意:第一个参数是元祖,用来指定大小(3,4)。empty不是总是返回全0,有时返回的是未初始的随机值。

    np.eye(2,3)#2*3单位矩阵
    # array([[1., 0., 0.],
    #        [0., 1., 0.]])
    
    np.eye(3)#3*3单位矩阵
    # [[1. 0. 0.]
    #  [0. 1. 0.]
    #  [0. 0. 1.]]
    
    #np.arange()
    # 类似range(),注意是arange,不是英文arrange
    print(np.arange(10))#[0 1 2 3 4 5 6 7 8 9]
    

      

    zeros_float_arr=np.zeros((3,4),dtype=np.float64)
    print(zeros_float_arr.dtype)#float64
    print(zeros_float_arr)
    # [[0. 0. 0. 0.]
    #  [0. 0. 0. 0.]
    #  [0. 0. 0. 0.]]
    
    zeros_int_arr=zeros_float_arr.astype(np.int32)
    print(zeros_int_arr.dtype)#int32
    print(zeros_int_arr)
    # [[0 0 0 0]
    #  [0 0 0 0]
    #  [0 0 0 0]]
    

      

    矢量与矢量运算

    arr=np.array([[1,2,3],
                  [4,5,6]])
    #元素相乘
    print(arr*arr)
    # [[ 1  4  9]
    #  [16 25 36]]
    
    # 矩阵相加
    print(arr+arr)
    # [[ 2  4  6]
    #  [ 8 10 12]]
    

      

    print(1./arr)
    # [[1.         0.5        0.33333333]
    #  [0.25       0.2        0.16666667]]
    
    print(2.*arr)
    # [[ 2.  4.  6.]
    #  [ 8. 10. 12.]]
    

      

    #一维数组
    arr1=np.arange(10)
    print(arr1)#[0 1 2 3 4 5 6 7 8 9]
    print(arr1[2:5])#[2 3 4]
    

      

    #多维数组
    arr2=np.arange(12).reshape(3,4)
    arr2
    # array([[ 0,  1,  2,  3],
    #        [ 4,  5,  6,  7],
    #        [ 8,  9, 10, 11]])
    
    arr2[1]#array([4, 5, 6, 7])
    
    arr2[0:2,2:]
    # array([[2, 3],
    #        [6, 7]])
    

     

    import numpy as np
    a=np.array([[1,2,3],[4,5,6]])
    print(a)
    # [[1 2 3]
    #  [4 5 6]]
    print(a[1][0],a[1,0])#索引结果相同,均为第一行第零列元素 4
    

      

    #条件索引
    #找出data_arr中2015年后的数据
    data_arr=np.random.rand(3,3)
    print(data_arr)
    # [[0.74277876 0.03168798 0.60155076]
    #  [0.06961099 0.4674936  0.61162942]
    #  [0.23676798 0.40399878 0.80521454]]
    
    year_arr=np.array([[2000,2001,2000],
                       [2005,2002,2009],
                       [2001,2003,2010]])
    filtered_arr=data_arr[year_arr>=2005]
    print('索引后的数据:',filtered_arr)#索引后的数据: [0.06961099 0.61162942 0.80521454]
    
    #多个条件
    #多个条件的组合要使用& | ,而不是and or
    filtered_arr=data_arr[(year_arr<=2005)&(year_arr%2==0)]
    print('索引后的数据:',filtered_arr)#索引后的数据: [0.74277876 0.60155076 0.4674936]
    

      

    转置:
    arr=np.random.rand(2,3)
    print(arr)
    # [[0.61150182 0.22558736 0.37966609]
    #  [0.18998577 0.86658851 0.93381798]]
    
    print(arr.transpose())#同print(arr.T)
    print(arr.T)
    # [[0.61150182 0.18998577]
    #  [0.22558736 0.86658851]
    #  [0.37966609 0.93381798]]
    

      

    arr3d=np.random.rand(2,3,4)#2*3*4   对应(0,1,2)
    print(arr3d)
    # [[[0.21373013 0.19849355 0.33215605 0.52725921]
    #   [0.93922615 0.80779913 0.35420019 0.09954869]
    #   [0.57758754 0.07217543 0.34231125 0.94650619]]
    
    #  [[0.71771002 0.97230449 0.5350113  0.32420057]
    #   [0.15722108 0.38212327 0.70092714 0.25712219]
    #   [0.38823089 0.03036273 0.44572765 0.0959865 ]]]
    
    print(arr3d.transpose(1,0,2))#3*2*4   对应(1,0,2)
    # [[[0.21373013 0.19849355 0.33215605 0.52725921]
    #   [0.71771002 0.97230449 0.5350113  0.32420057]]
    
    #  [[0.93922615 0.80779913 0.35420019 0.09954869]
    #   [0.15722108 0.38212327 0.70092714 0.25712219]]
    
    #  [[0.57758754 0.07217543 0.34231125 0.94650619]
    #   [0.38823089 0.03036273 0.44572765 0.0959865 ]]]
    

      

    numpy中有一些常用的用来产生随机数的函数,randn()和rand()就属于这其中。 

    • numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值。 
    • numpy.random.rand(d0, d1, …, dn)的随机样本位于[0, 1)中
      np.random.randn(2,4)
      # array([[-0.92413736,  0.59971917,  0.4225436 , -0.93199644],
      #        [-1.29965982, -0.73300645,  0.52989576,  1.55531057]])
      
      np.random.rand(2,4)
      # array([[0.78828337, 0.13617667, 0.12360924, 0.96954394],
      #        [0.08698652, 0.35513682, 0.42040709, 0.79186291]])
      

        

     

    import numpy as np
    arr=np.random.randn(2,3)
    print(arr)
    # [[ 1.13669323  0.24028173  0.34788455]
    #  [ 0.86511261 -0.87732341  0.01820511]]
    
    #向上最接近的整数:
    print(np.ceil(arr))
    # [[ 2.  1.  1.]
    #  [ 1. -0.  1.]]
    
    #向下最接近的整数:
    print(np.floor(arr))
    # [[ 1.  0.  0.]
    #  [ 0. -1.  0.]]
    #四舍五入:
    print(np.rint(arr))
    # [[ 1.  0.  0.]
    #  [ 1. -1.  0.]]
    
    #判断元素是否为NaN(Not a Number):
    print(np.isnan(arr))
    # [[False False False]
    #  [False False False]]
    

      

    x1=np.arange(9).reshape((3, 3))
    # [[0 1 2]
    #  [3 4 5]
    #  [6 7 8]]
    
    x2=np.arange(3)#[0 1 2]
    
    #元素相乘
    print(np.multiply(x1,x2))
    # [[ 0  1  4]
    #  [ 0  4 10]
    #  [ 0  7 16]]
    

      

     

    arr=np.random.randn(3,4)
    print(arr)
    # [[-1.57353282 -0.78028594  0.71725837  1.18291454]
    #  [ 0.84210892  0.05140142  0.30834113  0.43600613]
    #  [-1.31534235 -1.70603397  0.72184736 -1.7484308 ]]
    
    print(np.where(arr>0,1,-1))
    # [[-1 -1  1  1]
    #  [ 1  1  1  1]
    #  [-1 -1  1 -1]]
    

      

    arr=np.arange(10).reshape(5,2)
    print(arr)
    # [[0 1]
    #  [2 3]
    #  [4 5]
    #  [6 7]
    #  [8 9]]
    print(np.sum(arr))#总和:45
    print(np.sum(arr,axis=0))#每一列求和:[20 25]
    print(np.sum(arr,axis=1))#每一行求和:[ 1  5  9 13 17]  
    

      

    numpy.argmax(a, axis=None, out=None):返回沿轴axis最大值的索引。

    Cumsum :计算轴向元素累加和,返回由中间结果组成的数组,重点就是返回值是“由中间结果组成的数组”
    arr=np.array([[[1,2,3],
                   [8,9,12]],
                  [[1,2,4],
                   [2,4,5]]]) #2*2*3
    print(arr.cumsum(0))
    # [[[ 1  2  3]
    #   [ 8  9 12]]
    
    #  [[ 2  4  7]
    #   [10 13 17]]]
    print(arr.cumsum(1))
    # [[[ 1  2  3]
    #   [ 9 11 15]]
    
    #  [[ 1  2  4]
    #   [ 3  6  9]]]
    print(arr.cumsum(2))
    # [[[ 1  3  6]
    #   [ 8 17 29]]
    
    #  [[ 1  3  7]
    #   [ 2  6 11]]]
    

      

    import numpy as np
    arr=np.arange(12).reshape(3,4)
    print(arr)
    '''
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    '''
    print(sum(arr))#求的是每一列的和    [12 15 18 21]
    print(sum(arr[0]))#求第0行的和    6
    print(sum(arr[:,0]))#求第0列的和   12
    print(sum(sum(arr)))#求总和   66
    print(arr.sum())#求总和   66
    print(arr.max())#求最大值   11
    print(max(arr[1]))#求第一列最大值  7
    print(max(arr[:,2]))#求第二列最大值  10
    # print(max(arr))无此用法
    #求最小值则用min,与max方法相同
    

    arr=np.random.randn(2,3)
    print(arr)
    # [[ 0.76153695  0.08640434 -0.59324569]
    #  [-0.72260221  1.3081049  -1.16616903]]
    print(np.any(arr> 0))#True
    print(np.all(arr> 0))#False
    

      

    arr=np.array([[1,2,1],
                 [2,3,4]])
    np.unique(arr)#array([1, 2, 3, 4])
    

      

    print(np.logspace(1,10,3))#等比数列    结果:[1.00000000e+01 3.16227766e+05 1.00000000e+10]
    s='HELLO'
    print(np.fromstring(s,dtype='int8'))#将字符串创建为矩阵     结果:[72 69 76 76 79]
    

     

     

    数据示例:(项目地址即为数据下载地址)

    # -*- coding:utf-8 -*-
    '''作者:qiqi
        日期:2018/03/
        项目名称:科技工作者心里健康数据分析(Mental Health in Tech Survey)
    '''
    import csv
    #数据采集路径
    data_path='./survey.csv'
    def run_main():
        '主函数'
        male_set={'male','m'}#“男性”可能的取值
        female_set={'female','f'}#“女性”可能的取值
        #构造统计结果的数据结构result_dict
        #其中每个元素是键值对,“键”是国家的名称,“值”是列表结构
        #列表的第一个元素为该国家的女性统计数据,第二个数为该国家男性统计数据
        #如{'united States':[20,50],'Canada':[30,40]}
        result_dict={}
        with open(data_path,'r',newline='') as csvfile: #newline=' '新的一行用空字符串打开,可以不写
            #加载数据
            rows=csv.reader(csvfile)
            for i,row in enumerate(rows):
                if i==0:
                    #跳过第一行表头数据
                    continue
                if i%50==0:
                    print('正在处理第{}行数据。。。'.format(i))
                #性别数据
                gender_val=row[2]
                country_val = row[3]
                # 去掉可能存在的空格
                gender_val = gender_val.replace(' ', '')
                # 转换为小写
                gender_val = gender_val.lower()
                # 判断“国家”是否已经存在
                if country_val not in result_dict:
                    # 如果不存在,初始化数据
                    result_dict[country_val] = [0, 0]
                # 判断性别
                if gender_val in female_set:
                    # 女性
                    result_dict[country_val][0] += 1
                elif gender_val in male_set:
                    # 男性
                    result_dict[country_val][1] += 1
                else:
                    # 噪声数据,不做处理
                    pass
                    # 将结果写入文件
        with open('gender_country.csv', 'w', newline='', encoding='utf-16') as csvfile:
            csvwriter = csv.writer(csvfile, delimiter=',')#delimiter为分隔符,默认是逗号,可以不写,也可以换别的
            # 写入表头
            csvwriter.writerow(['国家', '男性', '女性'])
            # 写入统计结果
            for k, v in list(result_dict.items()):
                csvwriter.writerow([k, v[0], v[1]])
    if __name__=='__main__':
        run_main()
    

      

    结果展示:

     作业:

    # -*- coding: utf-8 -*-
    """
        作者:     qiqi
        版本:     1.0
        日期:     2018/03/23
        项目名称:科技工作者心理健康数据分析 (Mental Health in Tech Survey)
    """
    import csv
    # 数据集路径
    data_path = './survey.csv'
    def run_main():
        mental_health_set = {'Yes'}  # 心理健康问题要找到的值
        result_dict = {}  # 最终结果存放列表
        with open(data_path, 'r', newline='') as csvfile:
            # 加载数据
            rows = csv.reader(csvfile)
            for i, row in enumerate(rows):
                if i == 0:
                    # 跳过第一行表头数据
                    continue
                if i % 50 == 0:
                    print('正在处理第{}行数据...'.format(i))
                age_val = row[1]  # 性别数据
                country_val = row[3]  # 国家
                mental_health_val = row[18]  # 是否有心理问题
                # 去掉可能存在的空格
                age_val = age_val.replace(' ', '')
                mental_health_val = mental_health_val.replace(' ', '')
                # 判断“国家”是否已经存在
                if country_val not in result_dict:
                    # 如果不存在,初始化数据
                    # result_dict[country_val] = []  # 存放所有符合条件的年龄
                    result_dict[country_val] = [0, 0, 0]  # 第一个参数存储符合条件的年龄总和, 第二个参数存储有多少条记录,第三个参数为结果
                # 有心理问题, 要过滤不合常理的数据,如Zimbabwe 年龄999999 392行
                if mental_health_val in mental_health_set and (len(age_val) <= 3):
                    # 列出所有符合条件的年龄列表
                    # result_dict[country_val].append(age_val)
                    # 第一个参数存储符合条件的年龄总和, 第二个参数存储有多少条记录
                    result_dict[country_val][0] += int(age_val)
                    result_dict[country_val][1] += 1
                else:
                    # 噪声数据,不做处理
                    pass
        # 将结果写入文件
        with open('mental_country1.csv', 'w', newline='', encoding='utf-16') as csvfile:
            csvwriter = csv.writer(csvfile, delimiter=',')
            # 写入表头
            csvwriter.writerow(['国家', '存在心理问题的平均年龄'])
            # 写入统计结果
            for k, v in list(result_dict.items()):
                # 处理年龄为0的所属国家记录
                if int(v[0]) == 0:
                    v[2] = 0
                else:
                    v[2] = round(int(v[0]) / int(v[1]), 2)  # 保证结果不出现多个小数位数
                csvwriter.writerow([k, v[2]])
    if __name__ == '__main__':
        run_main()
    

      结果:

    国家    存在心理问题的平均年龄
    United States    33.38
    Canada    29.88
    United Kingdom    31.57
    Bulgaria    26
    France    26
    Portugal    27
    Netherlands    33
    Switzerland    30
    Poland    0
    Australia    31.5
    Germany    32
    Russia    28
    Mexico    0
    Brazil    0
    Slovenia    19
    Costa Rica    0
    Austria    0
    Ireland    35.27
    India    24
    South Africa    61
    Italy    37
    Sweden    0
    Colombia    26
    Latvia    0
    Romania    0
    Belgium    30
    New Zealand    36.75
    Zimbabwe    0
    Spain    30
    Finland    27
    Uruguay    0
    Israel    27
    Bosnia and Herzegovina    0
    Hungary    27
    Singapore    39
    Japan    49
    Nigeria    0
    Croatia    43
    Norway    0
    Thailand    0
    Denmark    0
    Bahamas, The    8
    Greece    36.5
    Moldova    0
    Georgia    20
    China    0
    Czech Republic    0
    Philippines    31
    View Code

    补充:

    import numpy as np
    print(np.random.randn(5))#创建一个长度为5的一维数组,元素符合标准正太分布
    #[ 0.55026984 -0.71707067  0.53576958  0.08688139 -1.2597207 ]
    
    print(np.random.randint(10))#返回10以内(不包括10)的一个int数
    # 7
    
    print(np.random.randint(10,size=(2,3)))#返回10以内(不包括10)的int数,构成的2*3的数组
    '''[[9 3 0]
        [3 3 4]]'''
    
    print(np.random.randint(10,size=9))#长度为9的一维数组
    #[1 0 1 7 3 6 4 2 1]
    
    print(np.random.randint(10,size=9).reshape(3,3))
    '''
    [[0 9 7]
     [0 9 5]
     [2 0 2]]
    '''
    
    print(np.mat([[1,2,3],[4,5,6]]))#生成矩阵
    '''
    [[1 2 3]
     [4 5 6]]
    '''
    
    #array(数组)与mat(矩阵)是可以互相转换的
    a=np.random.randint(10,size=(2,3))
    b=np.mat(a)
    print(type(a))#<class 'numpy.ndarray'>
    print(type(b))#<class 'numpy.matrixlib.defmatrix.matrix'>
    print(a)
    '''
    [[7 3 1]
     [8 8 2]]
    '''
    print(b)
    '''
    [[7 3 1]
     [8 8 2]]
    '''
    #注:数组array之间的相乘除是元素的相乘除,矩阵的乘法必须是按照线性代数的乘法
    
    #使用pickle序列化numpy array到硬盘
    import pickle
    import numpy as np
    x=np.arange(10)
    print(x)
    f=open('x.pkl','wb')
    pickle.dump(x,f)
    f.close()
    #读取序列化文件
    f=open('x.pkl','rb')
    pickle.load(f)
    f.close()
    #使用numpy可以简化上述方法
    np.save('one_array',x)#保存为.npy文件
    np.load('one_array.npy')
    y=np.arange(5)
    print(x,y)#[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4]
    np.savez('two_array.npz',a=x,b=y)#保存两个到一个文件中(压缩)
    c=np.load('two_array.npz')
    print(c['a'],c['b'])
    
     
  • 相关阅读:
    通过串口工具下发指令的Python脚本
    启动app-inspector报Internal Server Error
    IOS版App的控件元素定位
    Webview页面的控件元素定位
    Android版App的控件元素定位
    将Xcode升级到10.0以上版本,Appium启动报错的问题
    IOS版DesiredCapabilities参数配置
    Android版DesiredCapabilities参数配置
    Cannot instantiate the type AppiumDriver,AppiumDriver升级引发的问题
    持续集成-jenkins 环境搭建
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/8597853.html
Copyright © 2011-2022 走看看