Numpy基础入门

作者: 躺在稻田里的小白菜 | 来源:发表于2018-08-02 11:13 被阅读0次

    一. Numpy的主要功能

    • 数组的算数和逻辑运算。
    • 傅立叶变换和用于图形操作的例程。
    • 线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。

    二. Numpy的基本数据结构

    Numpy提供的核心功能是数组,所以它的最基本的数据结构就是多维数组结构Ndarray。Ndarray无论是运算速度,还是功能函数都比list结构要更好。该结构的特点如下:

    1. 数组中所有的元素类型相同。
    2. 每个元素在内存中的块大小相同。
    3. 数组的维度信息存放在shape属性,类型信息存放在dtype属性。

    三. Ndarray结构的基本使用

    1. 创建Ndarray
    1. 直接使用np.array()创建
      numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
      object参数,接受一切序列型的对象,用于创建数组。
      dtype参数,为数组指定一个类型
      order参数,(C语言风格)按行显示数组='C'; 或者(Fortran语言风格)按列显示数组='F'
      ndmin参数,指定数组的最小维度
    # 最小维度  
    import numpy as np 
    a = np.array([1, 2, 3, 4, 5], ndmin =  2, dtype=np.float)  #本来是一维数组,强行控制它为二维数组
    print (a)
    
    Out:
    [[1.0, 2.0, 3.0, 4.0, 5.0]]
    
    1. 固定填充元素创建
      创建空数组:numpy.empty (shape, dtype = float, order = 'C')
      创建全0数组:numpy.zeros (shape, dtype = float, order = 'C')
      创建全1数组:numpy.ones (shape, dtype = None, order = 'C')

    shape参数,整数表示一维数组的长度,元组表示多维数组的形状。

    1. 从已有数据中创建
      从其他序列创建 numpy.asarray(object, dtype = None, order = None)
      该函数类似于np.array(),主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。
      从迭代器创建 numpy.fromiter(iterable, dtype, count = -1)
      count参数,读取的数据量,-1表示所有数据

    2. 给定范围生成数组

    • 按步长 numpy.arange(start, stop, step, dtype)

    • 按间隔数量 numpy.linspace(start, stop, num, endpoint, retstep, dtype)

    2. Ndarray的常用属性
    • ndarray.shape 数组维度
    • ndarray.dtype 数组类型
    • ndarray.ndim 数组最小维度
    • ndarray.itemsize 数组每个元素的字节长度
    3. Ndarray的切片与索引
    1. 下标索引:同Python,下标从0开始。
    2. 切片:与Python相同,Ndarray的切片依旧使用 [开始下标:终止下标(不包含):步长]的格式。
      可以使用省略号...,表示某个维度的所有元素
    arr=np.asarray([[1,2,3,4],[5,6,7,8]])
    print(arr)
    print(arr[...,1])# 打印第2列所有元素
    
    Out:
    [[1 2 3 4]
     [5 6 7 8]]
    
    [2 6]
    

    注意:Numpy切片与Python序列切片最大的不同在于,ndarray切片返回值是原数组的视图,修改切片会影响原数组;而Python序列的切片返回值是副本,与原序列没关系。如果需要ndarray的切片副本,需要显示复制a=arr[2:5].copy()

    4. Ndarray的高级索引
    1. 整数索引
      以前访问多维数组的时候,我们使用多个中括号来表达不同的轴,比如下图。这种方式一次只能访问一个元素。
    arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
    print (arr)
    print(arr[1][0])
    
    Out:
    [[2 3 4]
     [6 7 8]
     [1 1 1]]
    
    6
    

    如果我们使用的中括号的数量小于数组的维度,那么更高级的轴将被全选,比如下图。

    arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
    print (arr)
    print(arr[1])
    
    out:
    [[2 3 4]
     [6 7 8]
     [1 1 1]]
    
    [6 7 8]
    

    但是对于更高级的轴,我们不想全选,只想选取若干个怎么办?这时Ndarray的特点就显现了。他可以对每个轴都进行选择,用逗号隔开每个轴之间的下标,按顺序构成坐标对,举个例子,下图中,第一个中括号表示对第一个轴的选取,第二个中括号是对第二个轴的选取,两个轴按顺序构成坐标对(0,1),(1,2),得到这2个位置的数据

    arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
    print (arr)
    print(arr[ [0,1],[1,2] ])
    
    Out:
    [[2 3 4]
     [6 7 8]
     [1 1 1]]
    
    [3 8]
    

    上面是按照坐标对来选择的,如果想选择某块数据怎么办?我们可以按轴切片,轴切片之间用逗号隔开,举个例子。

    arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
    print (arr)
    print(arr[:2,1:])
    
    Out:
    [[2 3 4]
     [6 7 8]
     [1 1 1]]
    
    [[3 4]
     [7 8]]
    

    敲黑板,总结 一下整数索引:

    • 老旧方法:1. 使用与维度数目一样的中括号来访问单个元素;2. 使用少于维度数目的中括号访问一片高维度数据。
    • Ndarray独有方法:在中括号内对所有轴做选择,不同轴用逗号隔开arr[轴1,轴2,轴3],枚举下标要用中括号包裹起来,切片不用包裹,二者可以混用。举个栗子:
    arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
    print (arr)
    print(arr[ [0,1],1: ])
    
    Out:
    [[2 3 4]
     [6 7 8]
     [1 1 1]]
    
    [[3 4]
     [7 8]]
    
    1. 布尔索引
      之前我们在某个维度选取元素的时候,使用的都是整数下标,其实可以不用下标的,而是用布尔数组,但是要求布尔数组和这个维度的长度一致。举个例子,假设我们要选择第二行所有数据:
    arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
    print (arr)
    print(arr[ [False,True,False] ])
    
    Out:
    [[2 3 4]
     [6 7 8]
     [1 1 1]]
    
    [[6 7 8]]
    

    或者选择第二行,第二列和第三列的数据。方法和整数索引一样,不同的是,这次用布尔数组。

    arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
    print (arr)
    print(arr[[False,True,False],[False,True,True]])
    
    Out:
    [[2 3 4]
     [6 7 8]
     [1 1 1]]
    
    [7 8]
    

    其实Ndarray做逻辑运算的时候,会返回一个布尔数组,我们可以利用这一点,直接进行数据选择:

    arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
    print(arr)
    print (arr>2)
    print(arr[arr>2])
    
    Out:
    [[2 3 4]
     [6 7 8]
     [1 1 1]]
    
    [[False  True  True]
     [ True  True  True]
     [False False False]]
    
    [3 4 6 7 8]
    

    最后强调一点,布尔数组必须和筛选维度的长度一致!!!!

    相关文章

      网友评论

        本文标题:Numpy基础入门

        本文链接:https://www.haomeiwen.com/subject/saxqvftx.html