• NumPy的使用


    一、什么是NumPy

    (一)工作环境的安装

      使用的是Anaconda环境,它是一个集成的工作环境,方便管理各种包,这里提供一个版本的链接: https://pan.baidu.com/s/1pHqRTy_uwKMArtt8SvY6Tw 提取码: 3922 。在下载后按照指示进行安装即可。

      注意安装完毕后需要进行环境变量的配置,在电脑的系统环境变量中进行配置,将Anaconda的安装路径以及scripts路径导入系统path中。

      此时可以在左下角开始处打开Anaconda Prompt终端:

    1、检查是否安装成功

    (base) C:UsersAdministrator>conda --version
    conda 4.5.4

     2、管理虚拟环境

    •  查看所有的虚拟环境
    (base) C:UsersAdministrator>conda info --envs
    # conda environments:
    #
    base                  *  H:Anaconda3
    python35                 H:Anaconda3envspython35
    • 创建新的虚拟环境
    (base) C:UsersAdministrator>conda  create -n python37  python=3.7
    • 切换环境
    (base) C:UsersAdministrator>activate python35
    
    (python35) C:UsersAdministrator>
    • 安装包
    (python35) C:UsersAdministrator>conda install requests
    
    ##或者
    (python35) C:UsersAdministrator>pip install requests
    • 卸载包
    (python35) C:UsersAdministrator>conda remove requests
    
    ##或者
    (python35) C:UsersAdministrator>pip uninstall requests
    • 查看包的信息
    (python35) C:UsersAdministrator>conda list
    • 导入导出环境
    #导出环境
    (python35) C:UsersAdministrator>conda env export > environment.yaml
    
    #导入新的虚拟环境
    (python34) C:UsersAdministrator>conda env create -f environment.yaml
    • 卸载虚拟环境
    (python35) C:UsersAdministrator>conda remove --name python34 --all

    (二)什么是NumPy

    NumPy是使用Python进行科学计算的基础软件包。是一个运行速度非常快的科学计算库,因为它的底层逻辑是使用C语言实现的,NumPy的功能非常多,其主要功能包括:

    • 功能强大的N维数组对象。
    • 精密广播功能函数。
    • 集成 C/C+和Fortran 代码的工具。
    • 强大的线性代数、傅立叶变换和随机数功能。

    在使用NumPy之前需要先进行它的环境搭建,在虚拟环境中只需要安装对应的包即可:

    (python35) C:UsersAdministrator>conda install numpy

    安装完毕后进行测试:

    (python35) C:UsersAdministrator>python
    Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  5 2016, 11:41:13) [MSC v
    .1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import numpy as np
    >>>

    二、NumPy的使用

    (一)数组对象

    1、属性

    NumPy 最重要的一个特点是其 N 维数组对象(矩阵) ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。其特点如下:

    • 所有元素必须是相同类型
    • ndim属性,维度个数
    • shape属性,各维度大小
    • dtype属性,数据类型
    • axis属性,轴参数
    • size属性,数组元素的个数

    举例说明:

    import numpy as np
    
    #随机生成3行4列的数据
    data = np.random.rand(3,4)
    print(data)
    
    ###########输出##########
    [[0.77006414 0.40472558 0.07331437 0.55188175]
     [0.80664964 0.84844352 0.08464626 0.67016604]
     [0.14836505 0.82259737 0.45900147 0.60369758]]

    上述生成的是一个3行4列的矩阵:

    print('维度个数',data.ndim) #维度个数 2
    print('各维度大小',data.shape) #各维度大小 (3, 4)
    print('数据类型',data.dtype) #数据类型 float64

    需要着重强调一下axios参数,对于维度的转换或者,对某一个维度的操作都需要用到此参数:

    >>> data = np.arange(10).reshape(2,5)
    >>> data
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    #在横轴方向进行操作
    >>> data.sum(axis=1)
    array([10, 35])
    #在纵轴方向进行操作
    >>> data.sum(axis=0)
    array([ 5,  7,  9, 11, 13])
    >>>

     2、创建数组

    • np.zeros, np.ones,np.empty

    指定大小的全0或全1数组,值得注意的是:

    (1)第一个参数是元组,用来指定大小,如(4,5)

    (2)empty不是总是返回全0,有时返回的是未初始的随机值

    #创建一维数组
    >>> import numpy as np
    >>> np.zeros(5,dtype=float)
    array([0., 0., 0., 0., 0.])   #创建浮点型全为0的数组
    >>> np.zeros(5,dtype=int) 
    array([0, 0, 0, 0, 0])  #创建整型全为0的数组
    
    >>> np.ones(5)
    array([1., 1., 1., 1., 1.]) #创建值全为1的数组
    
    #创建一个空数组,然后将空数组使用fill方法进行填充
    >>> a = np.empty(4)
    >>> a
    array([7.33483560e-315, 7.33405037e-315, 2.49174182e-316, 2.07211804e-316])
    >>> a.fill(6)
    >>> a
    array([6., 6., 6., 6.])
    >>>
    
    #创建多维数组
    >>> np.zeros((4,5))
    array([[0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.]])
    >>> np.ones((4,5))
    array([[1., 1., 1., 1., 1.],
           [1., 1., 1., 1., 1.],
           [1., 1., 1., 1., 1.],
           [1., 1., 1., 1., 1.]])
    >>> np.empty((3,4))
    array([[1.186e-321, 0.000e+000, 0.000e+000, 0.000e+000],
           [0.000e+000, 0.000e+000, 0.000e+000, 0.000e+000],
           [0.000e+000, 0.000e+000, 0.000e+000, 0.000e+000]])
    >>> np.empty((3,4),int)  #指定数据类型
    array([[1484587258,          0, 1484587600,          0],
           [1484428320,          0,   13996488,          0],
           [   7077996,    4784128,         84,    5006336]])
    • np.random 创建随机数的数组

    np.random模块半酣许多可用于创建随机数组的函数,例如生成一个服从标准正态分布(均值为0、方差为1)的随机样本数组:

    #一维数组
    >>> np.random.randn(5)
    array([ 0.80726684, -0.47856828, -1.01387413, -1.81198436, -0.30367494])
    
    #多维数组
    >>> np.random.randn(5,4)
    array([[ 0.44795214,  0.58889219,  0.6557998 , -0.98750982],
           [ 0.96874065, -0.83364282,  0.40935755,  0.17958365],
           [-0.3830435 , -0.13996465,  0.65810287, -1.09443092],
           [-1.67776307,  0.00275889, -1.32662109,  1.25585212],
           [-0.66629589, -1.09667777,  1.08017396,  1.04579035]])

     其它用法:

    (1)numpy.random.rand(d0, d1, ..., dn)

    生成一个(d0, d1, ..., dn)维的数组,数组的元素取自[0, 1)上的均分布,若没有参数输入,则生成一个数

    #一个数
    >>> np.random.rand()
    0.5602091565863412
    
    #多维数组
    >>> np.random.rand(2,3)
    array([[0.21425158, 0.55603564, 0.71230788],
           [0.91407327, 0.12856442, 0.31680005]])
    
    >>> np.random.rand(2,2,3)
    array([[[0.66192283, 0.06463257, 0.49716463],
            [0.90722766, 0.02891533, 0.97793578]],
    
           [[0.30110233, 0.61075461, 0.85996915],
            [0.62196878, 0.82921807, 0.12312781]]])

    (2)numpy.random.randint(low, high=None, size=None, dtype='I')

    生成size个整数,取值区间为[low, high),若没有输入参数high则取值区间为[0, low)

    >>> np.random.randint(6)
    4
    >>> np.random.randint(6,size=2)
    array([1, 5])
    >>> np.random.randint(6,size=2,dtype='int64')
    array([5, 0], dtype=int64)

    (3)numpy.random.random(size=None)

     产生[0.0, 1.0)之间的浮点数

    >>> np.random.random()
    0.45467454915616023
    >>>
    
    >>> np.random.random(6)
    array([0.30329601, 0.59093303, 0.37975647, 0.23568354, 0.01647539,
           0.46731369])
    
    >>> np.random.random((6,3))
    array([[8.65067985e-01, 6.32889091e-02, 8.97145125e-01],
           [2.41960732e-01, 7.63990918e-01, 3.28925883e-01],
           [7.77391602e-01, 2.94343398e-01, 2.47273732e-02],
           [6.80504494e-01, 7.56751159e-01, 4.94071081e-04],
           [5.18076628e-01, 1.17604372e-01, 3.18197217e-01],
           [5.13292960e-01, 5.19054712e-01, 6.87742571e-01]])
    • np.arange
    #创建一维数组
    >>> np.arange(10)
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    #创建多维数组
    >>> np.arange(10).reshape(2,5)
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    • np.array

    np.array(collection),collection为序列型对象(list),嵌套序列(list of list)

    #创建一维数组
    >>> np.array([1,2,3])
    array([1, 2, 3])
    >>> np.array(np.arange(1,4))
    array([1, 2, 3])
    
    #创建一个二维数组
    >>> np.array([[1,2,3],[4,5,6]])
    array([[1, 2, 3],
           [4, 5, 6]])
    
    >>> np.array([np.arange(1,4),np.arange(4,7)])
    array([[1, 2, 3],
           [4, 5, 6]])
    
    #创建多维混合类型数组
    >>> np.array([['a','b',1],[1,2,3]])
    array([['a', 'b', '1'],
           ['1', '2', '3']], dtype='<U1')

    3、数据类型

    常用 NumPy 基本类型:

    bool_ 布尔型数据类型(True 或者 False)
    int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
    intc 与 C 的 int 类型一样,一般是 int32 或 int 64
    intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
    int8 字节(-128 to 127)
    int16 整数(-32768 to 32767)
    int32 整数(-2147483648 to 2147483647)
    int64 整数(-9223372036854775808 to 9223372036854775807)
    uint8 无符号整数(0 to 255)
    uint16 无符号整数(0 to 65535)
    uint32 无符号整数(0 to 4294967295)
    uint64 无符号整数(0 to 18446744073709551615)
    float_ float64 类型的简写
    float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
    float32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
    float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
    complex_ complex128 类型的简写,即 128 位复数
    complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)
    complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)

    数组类型使用dtype属性查看:

      dtype,:类型名+位数,如float64、int32

    >>> a = np.array([1,2,3])
    >>> a.dtype
    dtype('int32')

    使用astype可转换数据类型:

    >>> a = np.array([1,2,3])
    >>> a.dtype
    dtype('int32')
    
    >>> b = a.astype(np.float64)
    >>> b
    array([1., 2., 3.])
    >>> b.dtype
    dtype('float64')

    4、索引和切片

    •  一维数组的索引和切片

    一维数组的索引与Python的列表索引功能相似

    >>> arr1 = np.array(np.arange(5))
    >>> arr1
    array([0, 1, 2, 3, 4])
    >>> arr1[0]
    0
    >>> arr1[0:]
    array([0, 1, 2, 3, 4])
    >>> arr1[0:2]
    array([0, 1])
    >>> arr1[2:-1]
    array([2, 3])
    • 多维数组的索引与切片

    使用多维数组,仍然可以像一维数组一样使用切片,并且多维数组可以在不同的维度中混合匹配切片和耽搁索引。

    以下面多维数组为例:

    >>> arr2 = np.array([np.arange(1,4),np.arange(4,7),np.arange(7,10)])
    >>> arr2
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])

    其中每个元素所处位置:

    0,0   0,1  0,2
    1,0 1,1 1,2
    2,0 2,1 2,2

    索引切片规则:

    • arr[r1:r2, c1:c2]
    • arr[1,1] 等价 arr[1][1]
    • [:] 代表某个维度的数据 
    #取一个范围的数据
    >>> arr2[1:3,1:3]
    array([[5, 6],
           [8, 9]])
    
    #取某一个值
    >>> arr2[1,1]
    5
    >>> arr2[1][1]
    5
    >>>
    
    #取某一个维度的值
    >>> arr2[:]
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    >>> arr2[1:]
    array([[4, 5, 6],
           [7, 8, 9]])
    
    >>> arr2[:,1]
    array([2, 5, 8])
    >>>

    另外在多维数组中还有条件索引,一般用于筛选多维数组:

    #条件索引
    
    # 找出 data_arr 中年龄大于等于5的数据
    >>> data_array = np.random.rand(3,3)
    >>> data_array
    array([[0.41418315, 0.12959096, 0.53636403],
           [0.23272318, 0.4801341 , 0.64412843],
           [0.05275439, 0.01490136, 0.52569593]])
    #过滤条件
    >>> age_array = np.arange(1,10).reshape(3,3)
    >>> age_array
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    #过滤得到的数据
    >>> filter_array = data_array[age_array >= 5]
    >>> filter_array
    array([0.4801341 , 0.64412843, 0.05275439, 0.01490136, 0.52569593])
    #多个过滤条件要使用 & |
    >>> filter_array = data_array[(age_array >= 5) & (age_array %2 == 0)]
    >>> filter_array
    array([0.64412843, 0.01490136])

    5、数组的运算

    数组的运算是将相同大小的数组间的运算应用在元素上,注意这与线性代数中矢量运算是不同的。

    ##矢量与矢量的运算
    >>> arr1 = np.arange(10).reshape(2,5)
    >>> arr1
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    
    >>> arr2 = np.arange(10,20).reshape(2,5)
    >>> arr2
    array([[10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19]])
    
    #数组相加
    >>> arr1+arr2
    array([[10, 12, 14, 16, 18],
           [20, 22, 24, 26, 28]])
    >>
    
    #数组相乘
    
    >>> arr1*arr2
    array([[  0,  11,  24,  39,  56],
           [ 75,  96, 119, 144, 171]])
    >>>
    
    ##矢量与标量的运算
    >>> 1/arr2
    array([[0.1       , 0.09090909, 0.08333333, 0.07692308, 0.07142857],
           [0.06666667, 0.0625    , 0.05882353, 0.05555556, 0.05263158]])
    
    >>> 2*arr2
    array([[20, 22, 24, 26, 28],
           [30, 32, 34, 36, 38]])
    >>>
    

    数组间的运算包含矢量与矢量、矢量与标量,其运算的规则就是:

    • 矢量运算,相同大小的数组键间的运算应用在元素上
    • 矢量和标量运算,“广播”— 将标量“广播”到各个元素

    (二)常用函数

    1、元素级函数

    • ceil, 向上最接近的整数
    • floor, 向下最接近的整数
    • rint, 四舍五入
    • isnan, 判断元素是否为 NaN(Not a Number)
    • multiply,元素相乘
    • divide, 元素相除
    >>> arr = np.random.randn(2,3)
    >>> arr
    array([[ 0.13900355,  1.0035698 , -1.18212763],
           [ 0.61880961,  0.55586212,  0.56438219]])
    #向上最接近的整数
    >>> np.ceil(arr)
    array([[ 1.,  2., -1.],
           [ 1.,  1.,  1.]])
    #向下最接近的整数
    >>> np.floor(arr)
    array([[ 0.,  1., -2.],
           [ 0.,  0.,  0.]])
    #四舍五入
    >>> np.rint(arr)
    array([[ 0.,  1., -1.],
           [ 1.,  1.,  1.]])
    #判断元素是否为 NaN(Not a Number)
    >>> np.isnan(arr)
    array([[False, False, False],
           [False, False, False]])
    >>>
    #数组相乘
    >>> arr1 = np.random.randn(2,3)
    >>> arr1
    array([[-0.04220886,  0.86937388, -2.46986511],
           [ 1.33986535, -0.70081799,  0.571598  ]])
    >>> arr2 = np.multiply(arr,arr1)
    >>> arr2
    array([[-0.00586718,  0.87247737,  2.91969579],
           [ 0.82912156, -0.38955817,  0.32259973]])
    #数组相除
    >>> arr3 = np.divide(arr,arr1)
    >>> arr3
    array([[-3.29323126,  1.15435928,  0.47862032],
           [ 0.46184462, -0.79316188,  0.98737608]])
    >>>

    2、统计函数

    • np.mean(x [, axis]): 所有元素的平均值,参数是 number 或 ndarray
    • np.sum(x [, axis]): 所有元素的和,参数是 number 或 ndarray
    • np.max(x [, axis]): 所有元素的最大值,参数是 number 或 ndarray
    • np.min(x [, axis]): 所有元素的最小值,参数是 number 或 ndarray
    • np.std(x [, axis]): 所有元素的标准差,参数是 number 或 ndarray
    • np.var(x [, axis]): 所有元素的方差,参数是 number 或 ndarray
    • np.argmax(x [, axis]): 最大值的下标索引值,参数是 number 或 ndarray
    • np.argmin(x [, axis]): 最小值的下标索引值,参数是 number 或 ndarray
    • np.cumsum(x [, axis]): 返回一个同纬度数组,每个元素都是之前所有元素的 累加和,参数是 number 或 ndarray
    • np.cumprod(x [, axis]): 返回一个同纬度数组,每个元素都是之前所有元素的 累乘积,参数是 number 或 ndarray

    注意多维的数组要指定统计的维度,否则默认是全部维度上统计。

    >>> arr = np.arange(12).reshape(4,3)
    >>> arr
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11]])
    >>> np.sum(arr)
    66
    >>> np.sum(arr,axis=1)
    array([ 3, 12, 21, 30])
    >>>

    3、条件函数

    • all(iterables):如果可迭代对象iterables中所有元素为True则返回True。
    • any(iterables):如果可迭代对象iterables中任意存在每一个元素为True则返回True。
    • unique(iterables):从可迭代对象iterables中找到唯一值(去重)并返回排序结果
    >>> arr =np.array([[1,2],[2,4]])
    >>> arr
    array([[1, 2],
           [2, 4]])
    >>> np.all(arr)
    True
    >>> np.any(arr)
    True
    >>> np.unique(arr)
    array([1, 2, 4])
    >>>

    4、文件存储函数

    当进行数组操作后需要将数组的内容进行保存,此时需要用到文件存储的函数。

    •  savetxt
    •  loadtxt
    import numpy as np
    
    array = np.arange(20)
    
    #将数组array以整数形式保存到a.txt文件中
    np.savetxt("a.txt",array,fmt='%d')
    #将数组array以浮点数形式保存到b.txt文件中
    np.savetxt("b.txt",array,fmt='%.2f')
    
    #从a.txt文件中以整数形式读取文本数据,并返回NumPy数组
    array1 = np.loadtxt("a.txt",dtype='int')
    print(array1)
    #从b.txt文件中以浮点数形式读取文本数据,并返回NumPy数组
    array2 = np.loadtxt("b.txt",dtype='float')
    print(array2)

      savetxt和loadtxt函数也是可以读写CSV文件,CSV文件是用分隔符分隔的文本文件,通常的分隔符包括空格、逗号、分号等;通过loadtxt函数可以读取CSV文件,通过savetxt函数可以将数组保存为CSV文件。

      savetxt和loadtxt函数默认都是使用空白符(空格、制表符等)作为分隔符,但可以通过delimiter关键字参数指定分隔符,还可以通过usecols关键字参数将读取的数据拆分成多列返回,列索引从0开始。

    import numpy as np
    
    array = np.arange(12).reshape(3,4)
    print(array)
    
    #将二维数组保存到c.txt文件中,并用逗号分隔
    np.savetxt("c.txt",array,fmt="%d",delimiter=',')
    
    #从c.txt文件以整数类型读取文本,并且获取第1,3列的数据
    array3 = np.loadtxt("c.txt",dtype=int,delimiter=",",usecols=(0,2))
    print(array3)
    
    #将上述获取的第1,3列数据赋值给x,y变量,必须将unpack=True
    x,y = np.loadtxt("c.txt",dtype=int,delimiter=",",usecols=(0,2),unpack=True)
    print(x,y)

    参考:

    https://conda.io/docs/using/envs.html

    https://www.runoob.com/numpy/numpy-tutorial.html

  • 相关阅读:
    Bootstrap组件福利篇 网址
    <a>标签中的href="javascript:;"
    HTTP请求上下文之终结:HttpContext类
    数据库分离 附加 sqlserver
    C#中三层架构UI、BLL、DAL、Model实际操作(转)
    比较好的网上的sqlserver读书笔记
    ORACLE重建索引详解
    SQL Server遍历表的几种方法(转)
    提高数据库操作的效率(转)
    哈希表Hashtable与字典表Dictionary<K,V>的比较。
  • 原文地址:https://www.cnblogs.com/shenjianping/p/11951015.html
Copyright © 2020-2023  润新知