zoukankan      html  css  js  c++  java
  • numpy简单入门

    声明:本文大量参考https://www.dataquest.io/mission/6/getting-started-with-numpy(建议阅读原文)

     

    读取文件

    有一个名为world_alcohol.csv的文件,文件格式如下

    Year,WHO region,Country,Beverage Types,Display Value

    1986,Western Pacific,Viet Nam,Wine,0

    1986,Americas,Uruguay,Other,0.5

    1985,Africa,Cte d'Ivoire,Wine,1.62

    文件内容的含义:(这是一份全球的饮料消耗记录表,第一列的意思是记录的年份,第二列指的是饮料的出产地,第三列指的是饮料的消耗地,第四列指的是饮料的类型,第五列指的是饮料的每人平均消耗量)

    图片1

     

    现在使用numpy的genfromtxt()函数来读取该文件,delimiter参数是用来指定每一行用来分隔数据的分隔符

    import numpy
    
    world_alcohol = numpy.genfromtxt('world_alcohol.csv', delimiter=',')
    
    print(world_alcohol)

    此时读取到的内容如下:

    [[             nan              nan              nan              nan

                   nan]

    [  1.98600000e+03              nan              nan              nan

        0.00000000e+00]

    [  1.98600000e+03              nan              nan              nan

        5.00000000e-01]

    ..., 

    [  1.98600000e+03              nan              nan              nan

        2.54000000e+00]

    [  1.98700000e+03              nan              nan              nan

        0.00000000e+00]

    [  1.98600000e+03              nan              nan              nan

        5.15000000e+00]]

     

    这是因为numpy在读取元素时,默认是按照float格式来读取的,对于不能转换为float类型的数据会读取为nan(not a number),对于留空的数据则显示为na(not available),为了正确的读取数据,可以通过增加参数:

    1. dtype参数用来指定读取数据的格式,这里的U75表示将每一个数据都读取为75个byte的unicode数据格式
    2. skip_header参数用来跳过文件的第一行
    3. delimiter参数用来指定每行数据的分隔符
    import numpy
    
    world_alcohol = numpy.genfromtxt('world_alcohol.csv', dtype='U75', skip_header=True, delimiter=',')
    
    print(world_alcohol)

     

    数组

    可以通过array()函数来创建一个数组,在这里向量指的是变量只有一个列表,矩阵指的是具有多个列表的列表

    创建一个向量:vector = numpy.array([10, 20, 30])

    创建一个矩阵:matrix = numpy.array([[5,10,15],[20,25,30],[35,40,45]])

     

    数组的属性:

    1. shape属性描述了该数组的结构
    2. print(vector.shape)

      输出结果: (3,) 这是一个元组,表示vector变量是一个只有一行的向量,具有3个元素

      print(matrix.shape)

      输出结果: (3,3)表示matrix变量是一个3 × 3的矩阵,具有3行3列共9个元素

    3. dtype属性描述了元素的数据类型
    4. print(vector.shape)

      输出结果: int64 

    数据类型大致有以下几种:

    1. bool -- 布尔类型,True或者False
    2. int -- 整型,分为int16, int32, int64,后面的数字表明数值的长度
    3. float -- 浮点型,分为float16, float32, float64,后面的数字表明数值的长度
    4. string -- 字符串类型,分为string或者unicode,它们的差异在于存储字符的方式

     

    索引和分片

    谨记一点:数组的索引是从0开始的

    matrix = numpy.array([
    
           [5,10,15],
    
           [20,25,30],
    
           [35,40,45]
    
           ])
    
    print(matrix[1][1])  # 两种方式都可以索引数据,输出结果都是25,注意这里索引的是第二行第二个
    
    print(matrix[1,1])

    可以类似于使用切片来操作数据(将切片操作符 : 理解为‘全部’)

    print(matrix[:,0]) # 输出全部行,第一列的数据 [ 5 20 35]
    
    print(matrix[0,:]) # 输出第一行,全部列的数据 [ 5 10 15]
    
    print(matrix[:,0:2]) # 输出全部行,前2列的数据[  [5, 10],  [20, 25],  [35, 40]  ]
    
    print(matrix[1:3,:]) # 输出第2和第3行的全部列的数据 [  [20, 25, 30],  [35, 40, 45]  ]
    
    print(matrix[1:3,1]) # 输出第2,3行的第1列数据 [ [10],  [25] ]

     

    数组比较

    将数组与一个值相比较的时候,实际上是把数组内的每个值都与该值比较,然后返回一个布尔值列表

    vector = numpy.array([5, 10, 15, 20])
    
    vector == 10
    
    返回的是:[False, True, False, False]

    对于矩阵也如此

    matrix = numpy.array([
    
                        [5, 10, 15], 
    
                        [20, 25, 30],
    
                        [35, 40, 45]
    
                     ])
    
    matrix == 25
    
    结果如下:[
    
        [False, False, False], 
    
        [False, True,  False],
    
        [False, False, False]
    
    ]

    数组比较中还可以使用多条件

    vector = numpy.array([5, 10, 15, 20])
    
    equal_to_ten_and_five = (vector == 10) & (vector == 5)
    
    输出:[False, False, False, False]
    
    equal_to_ten_or_five = (vector == 10) | (vector == 5)
    
    输出:[True, True, False, False]

     

    数组比较的最大用处是

    一、用来选择数组或矩阵中的元素

    matrix = numpy.array([
    
                    [5, 10, 15], 
    
                    [20, 25, 30],
    
                    [35, 40, 45]
    
                 ])
    
        second_column_25 = (matrix[:,1] == 25)
    
    print(matrix[second_column_25, :])
    
    作用:提取出matrix中第二列中等于25的所有行,结果为[20, 25, 30]

    二、替换元素

    vector = numpy.array([5, 10, 15, 20])
    
    equal_to_ten_or_five = (vector == 10) | (vector == 5)
    
    vector[equal_to_ten_or_five] = 50
    
    print(vector)
    
    输出:[50, 50, 15, 20]

    原理如下:

    图片2

     

    常用于替换空元素

    譬如将world_alcohol中的第五列中的留空的数据都替换为字符串0:

    is_value_empty = world_alcohol[:, 4] == ' '
    
    world_alcohol[is_value_empty, 4] = '0'

     

     

    数据类型转换

    通过使用astype()函数来转换一个数组的数据类型

    vector = numpy.array(["1", "2", "3"])
    
    vector = vector.astype(float)
    
    print(vector)
    
    结果:[1.0, 2.0, 3.0]

     

     

    简单的运算

    参考numpy的手册:http://docs.scipy.org/doc/numpy-1.10.1/index.html

    挑出几个重要的运算函数:

    1. l sum() -- 计算一个向量中的全部元素的总和,或者是一个矩阵中的一个维度的总和
    2. l mean() -- 同上,计算的是平均值
    3. l max() -- 同上,计算的是最大值
    vector = numpy.array([5, 10, 15, 20])
    vector.sum()
    
    结果为:50
    
    matrix = numpy.array([
    
                    [5, 10, 15], 
    
                    [20, 25, 30],
    
                    [35, 40, 45]
    
                 ])
    
    matrix.sum(axis=1)
    
    结果:[30, 75, 120]
    
    对于矩阵来说,需要指定axis参数,该参数等于1时表示计算的是每行,等于0时表示计算的是每列的总和

    练习

    使用world_alcohol.csv文件,计算在1986年里每个国家的饮料消耗量

    import numpy
    
    world_alcohol = numpy.genfromtxt('world_alcohol.csv', dtype='U75', skip_header=True, delimiter=',')
    
    totals = {}
    
    year = world_alcohol[world_alcohol[:, 0] == '1989', :]  # 选择1989年的数据集
    
    countries = set(world_alcohol[:,2])  # 选择全部国家
    
    for each in countries: # 分别计算每个国家
    
        consumption = year[year[:,2] == each, :]  
    
        consumption[consumption[:, 4] == '',4] = '0'
    
        temp = consumption[:,4].astype(float)  # 将留空的数据转变为浮点数0参与运算
    
        country_consumption = temp.sum() 
    
        totals[each] = country_consumption

     

    总结

    使用numpy的比直接对一个列表集合的运算更加方便,主要优于以下几点:

    1. 更容易对数据进行计算
    2. 可以快速地进行数据索引和分片
    3. 可以快速地转换数据类型

    然而,numpy有一些不足之处:

    1. 在同一个数据集中的数据必须具有相同的数据类型,在处理多数据集时会变得很困难
    2. 行和列都需要使用数字来索引,而不能使用别名,这样容易造成混淆

     

    而Pandas解决了Numpy的几点不足

  • 相关阅读:
    node的function函数和路由代码的小例子
    关于node回调函数中同步和异步操作的理解
    node初学
    CTF知识点总结(二)
    知识图谱
    论文笔记 无监督与混合IDS
    CTF知识点总结(一)
    论文笔记 网络安全图谱以及溯源算法
    攻防世界 wtf.sh-150
    攻防世界 Web_php_wrong_nginx_config
  • 原文地址:https://www.cnblogs.com/kylinlin/p/5219855.html
Copyright © 2011-2022 走看看