zoukankan      html  css  js  c++  java
  • Python笔记_第五篇_Python数据分析基础教程_NumPy基础

    1. NumPy的基础使用涵盖如下内容:

      数据类型

      数组类型

      类型转换

      创建数组

      数组索引

      数组切片

      改变维度

    2. NumPy数组对象

      NumPy中的ndarray是一个多维数组对象,该兑现共有两部分组成:

      实际的数据

      描述这些数据的元数据。

      大部分的数组操作仅仅修改元数据部分而不改变底层的实际数据(其实就是一种浅拷贝理解)。

      ndarray支持更高的维度,因为数组一般是同质的,所以数组所有的元素类型必须是一致的。

      NumPy与Python一样数组的下标都是从0开始的。

      

      2.1 numpy.arange()创建数组和numpy.array()创建向量:

      dtype

    import numpy as np
    
    a = np.arange(5)
    print(a.dtype)

      arange(开始值,结束值,dtype)

      dtype返回的是数据类型,这里返回的是int32或int64

      shape

    import numpy as np
    
    a = np.array([0,1,2,3,4])
    print(a.shape)
    
    (5,)

      我们用shape返回向量的维度,这里是5行,列为空,返回值为元组类型。

      2.2 创建多维数组:

    import numpy as np
    
    a = np.array([np.arange(2),np.arange(2)])
    print(a)
    #[[0 1]
    # [0 1]]
    
    print(a.shape)
    #(2, 2)
    

     我们将arange函数创建的数组作为向量/列表的元素,把这个列表作为参数传递给array函数,从而创建了一个2*2的多维数组。

      2.3 选取数组元素

      有时候我们需要选取数组中的某个特定元素。喜爱宝是从0开始的

    import numpy as np
    
    a = np.array([[1,2],[3,4]])
    print(a)
    #[[1 2]
    # [3 4]]
    
    print(a[0,0])
    #1
    
    print(a[1,1])
    #4
    

      我们发现,在整个数组必须有一个大的括号包裹进里面的内容。

      2.4 数据类型

    a = np.array([[1,2],[3,4]],dtype='f')
    

      这些类型有些资料可以查找。另外还可以指定复数数组。

      2.5 自定义数据类型和dtype类的属性

      查看占用字节数:

      itemsize

    import numpy as np
    
    a = np.array([[1,2],[3,4]],dtype='f')
    print(a.dtype.itemsize)
    
    #4

      自定义数据类型用dtype,然后在调用:

    import numpy as np
    
    
    t = np.dtype([('name',str,40),('numitems',int),('price',float)])
    print(t)
    #[('name', '<U40'), ('numitems', '<i4'), ('price', '<f8')]
    print(t['name'])
    #<U40
    itemz = np.array([('Meaning of life DVD',42,3.14),('Butter',13,2.72)],dtype=t)
    print(itemz[1])
    #('Butter', 13, 2.72

      

      2.6 一维数组的索引和切片:

    import numpy as np
    
    
    a = np.arange(9)
    print(a)
    #[0 1 2 3 4 5 6 7 8]
    print(a[3:7])
    #[3 4 5 6]
    print(a[:7:2])
    #[0 2 4 6]
    print(a[::-1])
    #[8 7 6 5 4 3 2 1 0]
    

      我们发现这和Python列表的索引和切片是一样的。

      2.7 多维数组的切片和索引

      reshape:表示三维坐标来选定任意一个,即楼层、行号、列号

    import numpy as np
    
    
    b0 = np.arange(24)
    print(b0)
    #[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
    b = np.arange(24).reshape(2,3,4)
    print(b)
    #[[[ 0  1  2  3]
    #  [ 4  5  6  7]
    #  [ 8  9 10 11]]
    #
    # [[12 13 14 15]
    #  [16 17 18 19]
    #  [20 21 22 23]]]
    print(b.shape)
    #(2, 3, 4)
    
    print(b[:,0,0])
    #[ 0 12]

      

      2.8 改变数组的维度

      reshape(a,newshape,order='C')

      其中:

      a:数组-需要处理的数据。

      newshape:新格式-整数或数组(2,3)表示2行3列。新的形状应该与原来的形状金融。

      order:情况比前面两个参数有些复杂,这里会用比较大的篇幅解释,并在后面给出一个比较容易的示例。

      “C”指的是用类C写的读/索引顺序的元素,最后一个维度变化最快,第一个维度变化最慢。以二维数组为例,简单来讲就是横着读,横着写,优先读/写一行。

      “F”是指用FORTRAN类索引顺序读/写元素,最后一个维度变化最慢,第一个维度变化最快。竖着读,竖着写,优先读/写一列。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序。

      “A”选项所生成的数组的效果与原数组a的数据存储方式有关,如果数据是按照FORTRAN存储的话,它的生成效果与”F“相同,否则与“C”相同。这里可能听起来有点模糊,下面会给出示例。

      注:FORTRAN和C是两个语言,他们存储数组的方式不同,FORTRSAN为列有限,而C为行优先。在python中默认数组生成的时候是按照C的方式进行存储。但,很多时候我们需要调用Fortran的一些库进行数学计算,所以需要让numpy生成的数组变成按照FORTRAN的方式存储。

    import numpy as np
    
    
    b0 = np.arange(4)
    print(b0)
    #[0 1 2 3]
    
    b1 = b0.reshape((2,2))
    print(b1)
    #[[0 1]
    # [2 3]]
    
    b2 = np.arange(8)
    
    b3 = b2.reshape(2,2,2)
    print(b3)
    #[[[0 1]
    #  [2 3]]
    #
    # [[4 5]
    #  [6 7]]]
    

      

      ravel

      对矩阵进行展平操作:

    import numpy as np
    
    
    b0 = np.array([np.arange(2),np.arange(2)])
    print(b0)
    #
    #[[0 1]
    # [0 1]]
    
    print(b0.ravel())
    #[0 1 0 1]

      flatten:

    ·  也是展平操作,与ravel函数的功能相同。但是flatten函数会请求分配内存来报错结果,而ravel函数知识返回数组的一个视图(view)

      resize

      与reshaple函数工呢狗一样,但是热死则会直接修改锁操作的数组。

      transpose

      转置操作,属于数组的运算:

    import numpy as np
    
    b0 = np.array([np.arange(2),np.arange(2)])
    print(b0)
    #
    #[[0 1]
    # [0 1]]
    
    print(b0.transpose())
    #[[0 0]
    # [1 1]]
    

      

      2.9 数组的组合

      vstack

      垂直组合

    import numpy as np
    
    a = np.arange(9).reshape(3,3)
    print(a)
    #[[0 1 2]
    # [3 4 5]
    # [6 7 8]]
    
    b = 2 * a
    print(b)
    #[[ 0  2  4]
    # [ 6  8 10]
    # [12 14 16]]
    
    print(np.vstack((a,b)))
    #[[ 0  1  2]
    # [ 3  4  5]
    # [ 6  7  8]
    # [ 0  2  4]
    # [ 6  8 10]
    # [12 14 16]]

      dstack

      深度组合:就是将一系列数组沿着纵轴(深度)方向进行层叠组合。举个例子,有若干张二维平面内的图像点阵数据,我们可以讲这些图像数据沿着纵轴方向层叠一起,就香香的解释了什么是深度组合。

    import numpy as np
    
    a = np.arange(9).reshape(3,3)
    print(a)
    #[[0 1 2]
    # [3 4 5]
    # [6 7 8]]
    
    b = 2 * a
    print(b)
    #[[ 0  2  4]
    # [ 6  8 10]
    # [12 14 16]]
    
    print(np.dstack((a,b)))
    #[[[ 0  0]
    #  [ 1  2]
    #  [ 2  4]]
    #
    # [[ 3  6]
    #  [ 4  8]
    #  [ 5 10]]
    #
    # [[ 6 12]
    #  [ 7 14]
    #  [ 8 16]]]

      

      hstack

      水平组合

    import numpy as np
    
    a = np.arange(9).reshape(3,3)
    print(a)
    #[[0 1 2]
    # [3 4 5]
    # [6 7 8]]
    
    b = 2 * a
    print(b)
    #[[ 0  2  4]
    # [ 6  8 10]
    # [12 14 16]]
    
    print(np.hstack((a,b)))
    #[[ 0  1  2  0  2  4]
    # [ 3  4  5  6  8 10]
    # [ 6  7  8 12 14 16]]

      colum_stack

      列组合:column_stack函数对于一维数组将按照列方向进行组合。

    import numpy as np
    
    # 一维数组
    oned = np.arange(2)
    print(oned)
    #[0 1]
    
    twice_oned = 2 * oned
    print(twice_oned)
    #[0 2]
    
    print(np.column_stack((oned,twice_oned)))
    #[[0 0]
    # [1 2]]
    
    # 二维数组:对于二维数组column_stack的效果是hstack的效果是一样的。
    

      

      row_stack:

      行组合:对于两个以为少数族直接层叠起来合成一个二维数组。

      concatenate:

      这个的效果和hstack的效果是一样的。

      2.10 数组的分割:

      hsplit:

      水平分割

    import numpy as np
    
    a = np.arange(9)
    a = a.reshape(3,3)
    print(a)
    #[[0 1 2]
    # [3 4 5]
    # [6 7 8]]
    
    # 水平分割为3个大小相同的子数组
    print(np.hsplit(a,3))
    #[array([[0],
    #       [3],
    #       [6]]), 
    #array([[1],
    #       [4],
    #       [7]]), 
    #array([[2],
    #       [5],
    #       [8]])]
    

      

      vsplit

      垂直分割:

      dsplit

      深度分割:

      split

      默认分割

    print(np.split(a,3,axis=1))
    

      1 = 垂直,0 =水平

     

      2.11 数组的属性

      ndim属性,给出数组的维数或者数组轴的个数

      size属性,给出数组元素的总个数

      itemsize属性,给出数组中的元素在内存中所占的字节数

      real属性,给出实部

      image属性,给出虚部

      flat属性将返回一个numpy.flatiter对象,这是获得flatiter对象的唯一方式,我们无法访问flatiter的构造函数。这个所谓“扁平迭代器”,可以让我们像遍历一维数组一样去遍历任意多维数组。

      2.12 数组的转换:

      tolist

      将numpy数组格式转换成python列表模式

    import numpy as np
    
    a = np.arange(9).reshape(3,3)
    print(a)
    #[[0 1 2]
    # [3 4 5]
    # [6 7 8]]
    
    b = a.tolist()
    print(b,type(b))
    # [6 7 8]]
    #[[0, 1, 2], [3, 4, 5], [6, 7, 8]] <class 'list'>

        

      2.13 数组的运算

      加减乘除

      转置:transpose

      逆矩阵:linalg.inv()

    import numpy as np
    
    a = np.arange(9).reshape(3,3)
    print(a)
    #[[0 1 2]
    # [3 4 5]
    # [6 7 8]]
    
    b = np.linalg.pinv(a)
    print(b)
    
    #[[-5.55555556e-01 -1.66666667e-01  2.22222222e-01]
    # [-5.55555556e-02  2.01227923e-16  5.55555556e-02]
    # [ 4.44444444e-01  1.66666667e-01 -1.11111111e-01]]
    

      对角线矩阵:eye

    a = np.arange(9).reshape(3,3)
    print(a)
    #[[0 1 2]
    # [3 4 5]
    # [6 7 8]]
    
    b = np.eye(9,9)
    print(b)
    
    #[[1. 0. 0. 0. 0. 0. 0. 0. 0.]
    # [0. 1. 0. 0. 0. 0. 0. 0. 0.]
    # [0. 0. 1. 0. 0. 0. 0. 0. 0.]
    # [0. 0. 0. 1. 0. 0. 0. 0. 0.]
    # [0. 0. 0. 0. 1. 0. 0. 0. 0.]
    # [0. 0. 0. 0. 0. 1. 0. 0. 0.]
    # [0. 0. 0. 0. 0. 0. 1. 0. 0.]
    # [0. 0. 0. 0. 0. 0. 0. 1. 0.]
    # [0. 0. 0. 0. 0. 0. 0. 0. 1.]]
    

      零矩阵:zeros

      空矩阵:empty

      三角矩阵:diag

    import numpy as np
    
    a = np.arange(9).reshape(3,3)
    print(a)
    #[[0 1 2]
    # [3 4 5]
    # [6 7 8]]
    
    b = np.diag((1,2,3))
    print(b)
    #[[1 0 0]
    # [0 2 0]
    # [0 0 3]]
    

      

      2.14 矩阵库Matrix函数

      matrices必须是二维的,但是numpy arrays(ndarrays可以是多维的),matrix最主要的优势就是类似于matlab中的格式很相似,不用方括号括起来看起来不那么方便。但是是一种矩阵格式的数据不是ndarrays数据的格式,同样也可以通过tolist进行转化

    import numpy as np
    
    a = np.mat('4 3;2 1')
    print(a)
    #[[4 3]
    # [2 1]]
    print(type(a))
    #<class 'numpy.matrixlib.defmatrix.matrix'>
    b = a.tolist()
    print(b,type(b))
    #[[4, 3], [2, 1]] <class 'list'>
    

      

      

  • 相关阅读:
    使用FolderBrowserDialog组件选择文件夹
    使用OpenFileDialog组件打开多个文
    使用OpenFileDialog组件打开对话框
    获取弹出对话框的相关返回值
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1137 Final Grading (25 分)
    PAT 甲级 1137 Final Grading (25 分)
  • 原文地址:https://www.cnblogs.com/noah0532/p/11265736.html
Copyright © 2011-2022 走看看