• numpy模块


    一、numpy模块简介

    1. numpy的全名为numeric python,是一个开源的python科学计算库。

    2. 包含

      • 一个强大的N维数组对象ndrray

      • 比较成熟的函数库

      • 用于整合C/C++和Fortran代码的工具包

      • 实用的线性代数、傅里叶变换和随机数生成函数

    3. 优点

      • 对于同样的数值计算任务,实用numpy要比直接编写python代码便捷得多。

      • numpy中的数组的存储效率和输入输出性能均远远优于python中等价的基本数据结构,且其能够提升的性能是与数组中的元素成比例的。

      • numpy的大部分代码都是用C语言写的,其底层算法在设计时就有着优异的性能,这使得numpy比纯python代码高效的多

    4. 缺点

      • numpy使用内存映射文件以达到最优的数据读写性能,而内存的大小限制了其对TB级大文件的处理。

      • numpy数组的通用性不及python提供的list容器。

     

    二、创建numpy数组

    • 创建一维的ndarray对象

    import numpy as np
    
    arr = np.array([1, 2, 3])
    print(arr, type(arr))
    
    输出
    [1 2 3] <class 'numpy.ndarray'>

     

    • 创建二维的ndarray对象

    import numpy as np
    
    print(np.array([[1, 2, 3],[4, 5, 6]]))
    
    输出
    [[1 2 3]
     [4 5 6]]

     

    • 创建三维的ndarray对象

    import numpy as np
    
    print(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
    
    输出
    [[1 2 3]
     [4 5 6]
     [7 8 9]]

    import numpy as np print(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])) 输出 [[1 2 3] [4 5 6] [7 8 9]]

    三、numpy数组的属性

    属性 解释
    T 数组的转置(对高维数组而言)
    dtype 数组元素的数据类型
    size 数组元素的个数
    ndim 数组的维数
    shape 数组的维度大小(以元组形式)
    astype 类型转换

    dtype种类:bool_,int(8, 16, 32, 64), float(16, 32, 64)

    • 使用方法

    import numpy as np
        
    arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=float)
    arr = arr.astype(np.int32)
    print(arr)
    print(arr.dtype)
    print(arr.size)
    print(arr.ndim)
    print(arr.shape)
        
    输出
    [[1 2 3]
     [4 5 6]]
    int32
    6
    2
    (2, 3)
    • 获取numpy数组的行列数
    import numpy as np
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr.shape)
    print(arr.shape[0])
    print(arr.shape[1])
    
    输出
    (2, 3)
    2
    3

    四、切割numpy数组

    • ‘:’左边表示遮盖几行(列),‘:’右边表示显示几行(列)

    • 创造一个数组

    arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    print(arr)
        
    输出
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    • 获取所有元素 [:, :]

    print(arr[:, :])
        
    输出
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    • 获取第一行所有元素[:1, :]

    print(arr[:1, :])
        
    输出
    [[1 2 3 4]]
    • 获取第二、三行,第三、四列的元素[1:3, 2:4]

    print(arr[1:3, 2:4])
        
    输出
    [[ 7  8]
     [11 12]]
    • 获取第一行所有元素[0, [0, 1, 2, 3]]

    print(arr[0, [0, 1, 2, 3]])
        
    输出
    [1 2 3 4]
    • 获取第一列所有元素[(0, 1, 2), 0]

    print(arr[(0, 1, 2), 0])
        
    输出
    [1 5 9]
    • 获取第一行第一列的元素[0, 0]

    print(arr[0, 0])
        
    输出
    1
    • 获取大于5的元素,返回一个数组

    print(arr[arr > 5])
        
    输出
    [ 6  7  8  9 10 11 12]
    • 通过判断 arr>5 生成一个numpy数组

    print(arr > 5)
    
    输出
    [[False False False False]
     [False  True  True  True]
     [ True  True  True  True]]

    五、numpy数组元素替换

    • 创造一个数组

    arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    print(arr)
        
    输出
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    • 取第一行的所有元素,并且让第一行的元素都为0

    arr[:1, :] = 0
    print(arr)
        
    输出
    [[ 0  0  0  0]
     [ 5  6  7  8]
     [ 9 10 11 12]]

     

    • 取所有大于5的数,并让大于5的元素为0

    arr[arr > 5] = 0
    print(arr)
        
    输出
    [[1 2 3 4]
     [5 0 0 0]
     [0 0 0 0]]

     

    六、numpy数组的合并

    • hstack,水平合并

    import numpy as np
    arr1 = np.array([[1, 2], [3, 4], [5, 6]])
    arr2 = np.array([[7, 8], [9, 10], [11, 12]])
    print(np.hstack((arr1, arr2)))
        
    输出
    [[ 1  2  7  8]
     [ 3  4  9 10]
     [ 5  6 11 12]]
    • vstack,垂直合并

    import numpy as np
    arr1 = np.array([[1, 2], [3, 4], [5, 6]])
    arr2 = np.array([[7, 8], [9, 10], [11, 12]])
    print(np.vstack((arr1, arr2)))
        
    输出
    [[ 1  2]
     [ 3  4]
     [ 5  6]
     [ 7  8]
     [ 9 10]
     [11 12]]

     

    • Concatenate

        axis = 0 表示合并两个numpy数列的列,默认为0

        axis= 1 表示合并两个numpy数列的行

    import numpy as np
    arr1 = np.array([[1, 2], [3, 4], [5, 6]])
    arr2 = np.array([[7, 8], [9, 10], [11, 12]])
    print(np.concatenate((arr1, arr2), axis=1))
    
    输出
    [[ 1  2  7  8]
     [ 3  4  9 10]
     [ 5  6 11 12]]

    七、通过函数创建numpy数组

    方法 详解
    array() 将列表转换为数组,可选择显式指定dtype
    arange() range的numpy版,支持浮点数
    linspace() 类似arange(),第三个参数为数组长度
    zeros() 根据指定形状和dtype创建全0数组
    ones() 根据指定形状和dtype创建全1数组
    eye() 创建单位矩阵
    empty() 创建一个元素全随机的数组
    reshape() 重塑形状

     

    • array

    arr = np.array([1, 2, 3])
    print(arr)
        
    输出
    [1 2 3]
    • arange

    print(np.arange(1, 20, 2))
        
    输出
    [ 1  3  5  7  9 11 13 15 17 19]
    • linspace

        构造一个等差数列,取头也取尾,从0取到20,取5个数

    print(np.linspace(0, 20, 5))
        
    输出
    [ 0.  5. 10. 15. 20.]
    • logspace

        构造一个等比数列,从10^10取到10^20,取5个数

    print(np.logspace(0, 20, 5))
        
    输出
    [1.e+00 1.e+05 1.e+10 1.e+15 1.e+20]
    • zeros

    print(np.zeros((3, 4)))
        
    输出
    [[0. 0. 0. 0.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    • ones

    print(np.ones((3, 4)))
        
    输出
    [[1. 1. 1. 1.]
     [1. 1. 1. 1.]
     [1. 1. 1. 1.]]
    • eye

    print(np.eye(3))
        
    输出
    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    • empty

    print(np.empty((4, 4)))
    
    输出
    [[6.23042070e-307 1.42417221e-306 1.60219306e-306 1.11261095e-306]
     [1.42417221e-306 1.37961641e-306 6.23039015e-307 6.23053954e-307]
     [2.22522597e-306 1.06810268e-306 6.23052935e-307 1.11261434e-306]
     [8.45559303e-307 1.06811422e-306 1.05694828e-307 2.22522596e-306]]
    • reshape

    arr = np.ones([2, 2], dtype=int)
    print(arr.reshape(4, 1))
        
    输出
    [[1]
     [1]
     [1]
     [1]]

    八、数组运算

    运算符 说明
    + 两个numpy数组对应元素相加
    - 两个numpy数组对应元素相减
    * 两个numpy数组对应元素相乘
    / 两个numpy数组对应元素相除,如果都是整数则取商
    % 两个numpy数组对应元素相除后取余数
    **n 单个numpy数组每个元素都取n次方,如**2:每个元素都取平方

     

    • 使用方法

    import numpy as np
    
    arr1 = np.array([[1, 2], [3, 4], [5, 6]])
    arr2 = np.array([[7, 8], [9, 10], [11, 12]])
    print(arr1 + arr2)
    print()
    print(arr1 ** 2)
    
    输出
    [[ 8 10]
     [12 14]
     [16 18]]
    
    [[ 1  4]
     [ 9 16]
     [25 36]]

     

    九、numpy数组运算函数

    numpy数组函数 详解
    np.sin(arr) 对numpy数组arr中每个元素取正弦,sin(x)
    np.cos(arr) 对numpy数组arr中每个元素取余弦,cos(x)
    np.tan(arr) 对numpy数组arr中每个元素取正切,tan(x)
    np.arcsin(arr) 对numpy数组arr中每个元素取反正弦,arcsin(x)
    np.arccos(arr) 对numpy数组arr中每个元素取反余弦,arccos(x)
    np.arctan(arr) 对numpy数组arr中每个元素取反正切,arctan(x)
    np.exp(arr) 对numpy数组arr中每个元素取指数函数,
    np.sqrt(arr) 对numpy数组arr中每个元素开根号,

     

    • 使用方法

    import numpy as np
        
    arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    print(np.sin(arr))
    print()
    print(np.sqrt(arr))
    print()
    print(np.arcsin(arr * 0.1)) # 元素不在定义内返回 nan
    print()
    print(np.isnan(arr)) # 判断是否为nan
        
        输出
    [[ 0.84147098  0.90929743  0.14112001 -0.7568025 ]
     [-0.95892427 -0.2794155   0.6569866   0.98935825]
     [ 0.41211849 -0.54402111 -0.99999021 -0.53657292]]
         
    [[1.         1.41421356 1.73205081 2.        ]
     [2.23606798 2.44948974 2.64575131 2.82842712]
     [3.         3.16227766 3.31662479 3.46410162]]
         
    [[0.10016742 0.20135792 0.30469265 0.41151685]
     [0.52359878 0.64350111 0.7753975  0.92729522]
     [1.11976951 1.57079633        nan        nan]]
         
    [[False False False False]
     [False False False False]
     [False False False False]]

    十、numpy数组矩阵化

    1. numpy数组的点乘(dot)

      • numpy数组的点乘必须满足第一个numpy数组的列数等于第二个numpy数组的行数,即

      • 使用方法

    import numpy as np
            
    arr1 = np.array([[1, 2], [3, 4], [5, 6]])
    arr2 = np.array([[7, 8, 9], [9, 10, 11]])
            
    print(np.dot(arr1, arr2))
            
    输出
    [[ 25  28  31]
     [ 57  64  71]
     [ 89 100 111]]

       2. numpy数组的转置(transpose)

      • 把矩阵的行列依次互换称为矩阵的转置

      • 使用方法(transpose)

    import numpy as np
            
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr.transpose())
    print()
    print(arr.T)
            
    输出
    [[1 4]
     [2 5]
     [3 6]]
            
    [[1 4]
     [2 5]
     [3 6]]

      3. munpy数组的逆(linalg.inv)

      • 设A是数域上的一个n阶矩阵,若在相同数域上存在另一个n阶矩阵B,使得:AB=BA=E,则我们称B是A的逆矩阵。

      • 使用方法(linalg.inv)

    import numpy as np
            
    arr = np.array([[1, 2, 3], [4, 5, 6], [9, 8, 9]])
    print(np.linalg.inv(arr))
            
    输出
    [[ 0.5        -1.          0.5       ]
     [-3.          3.         -1.        ]
     [ 2.16666667 -1.66666667  0.5       ]]

     

     

    十一、numpy数组数学和统计方法

    方法 详解
    sum 求和
    cumsum 累加求和
    mean 求平均数
    std 求标准差
    var 求方差
    min 求最小值
    max 求最大值
    argmin 求最小值索引
    argmax 求最大值索引
    sort 排序

     

    • 求数组所有元素中的最大值,max

    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(arr.max())
        
    输出
    9
    • 求数组中每一行的最大值,max

    print(arr.max(axis=0))
        
    输出
    [7 8 9]
    • 求数组中每一列最大元素的索引位置,argmax

    print(arr.argmax(axis=1))
        
    输出
    [2 2 2]
    • 求所有元素的平均值,mean

    print(arr.mean())
    
    输出
    5.0
    • 求每一行的平均值,mean

    print(arr.mean(axis=1))
        
    输出
    [2. 5. 8.]
    • 求所有元素的方差,var

    print(arr.var())
        
    输出
    6.666666666666667
    • 求每一行元素的方差,var

    print(arr.var(axis=1))
            
    输出
    [0.66666667 0.66666667 0.66666667]
    • 求所有元素的标准差,std

    print(arr.std())
        
    输出
    2.581988897471611
    • 求每一行的标准差,std

    print(arr.std(axis=1))
    
    输出
    [0.81649658 0.81649658 0.81649658]
    • 求数组中所有元素的中位数,median

    print(np.median(arr))
        
    输出
    5.0
    • 求数组中每一行元素的中位数,median

    print(np.median(arr, axis=1))
        
    输出
    [2. 5. 8.]
    • 求数组中所有元素的和

    print(arr.sum())
        
    输出
    45
    • 对数组中每一行求和

    print(arr.sum(axis=1))
        
    输出
    [ 6 15 24]
    • 求累加和

    arr = np.array([1, 2, 3, 4, 5])
    print(arr.cumsum())
        
    输出
    [ 1  3  6 10 15]

    十二、numpy.random生成随机数

    函数名称 函数功能 参数说明
    rand(d0,d1,⋯,dn) 产生均匀分布的随机数 dn为第n维数据的维度
    randn(d0,d1,⋯,dn) 产生标准正态分布随机数 dn为第n维数据的维度
    randint(low[, high, size, dtype]) 产生随机整数 low:最小值;high:最大值;size:数据个数
    random_sample([size]) 在[0,1)内产生随机数 size为随机数的shape,可以为元组或者列表
    choice(a, size) 从arr中随机选择指定数据 arr为1维数组;size为数组形状
    uniform(low, high, size) 给定形状产生随机数组 low为最小值;high为最大值,size为数组形状
    shuffle(a) 与random.shuffle相同 a为指定数组

     

    • 让数据值随机一次,之后都是相同数据,RandomState

    rs = np.random.RandomState(1)
    print(rs.rand(10))
        
    输出
    [
    4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01 1.46755891e-01 9.23385948e-02
    1.86260211e-01 3.45560727e-01 3.96767474e-01 5.38816734e-01]

     

    • 随机生成一个3*4数组,rand

    np.random.seed(1)
    print(np.random.rand(3, 4))
        
    输出
    [[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01]
     [1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01]
     [3.96767474e-01 5.38816734e-01 4.19194514e-01 6.85219500e-01]]
    • 构造3*4的正态分布的numpy数组,randn

    print(np.random.randn(3, 4))
        
    输出
    [[-1.38223827 -1.42722177 -1.74047107 -0.36986561]
     [ 0.60869146  1.380522   -1.6533575   1.40307866]
     [-1.00627125 -1.0104025   0.04843809 -0.63272394]]

     

    • 构造取值为1-4内的10个元素的ndarray数组,randint

    print(np.random.randint(1, 5, 10))
    
    输出
    [2 4 1 1 4 2 4 2 4 1]
    • 构造取值为0-1内的3*4的numpy数组,random_sample

    print(np.random.random_sample((3, 4)))
        
    输出
    [[0.64239071 0.73383968 0.09981748 0.98683146]
     [0.39529641 0.98198702 0.29487973 0.43423212]
     [0.21923803 0.03519324 0.70681495 0.16788497]]
    • 随机选取arr中的两个元素,choice

    arr = (np.array([1, 2, 3]))
    print(np.random.choice(arr, size=2))
        
    输出
    [2 3]
    • 生成一个范围在(1, 5)的3*4的数组

    print(np.random.uniform(1, 5, (2, 3)))
        
    输出
    [[1.11463202 1.33658913 4.88244568]
     [2.14444532 4.98313849 2.24619138]]
    • 将arr数组中的元素打乱

    arr = (np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
    np.random.shuffle(arr)
    print(arr)
        
    输出
    [[7 8 9]
     [4 5 6]
     [1 2 3]]

     

  • 相关阅读:
    mcstructs使用CMake生成Makefile文件
    打印man手册为pdf文件
    ubuntu安装wine之后进不了系统
    如何知道自己梦呓的内容
    Opencv step by step
    Opencv step by step
    树莓派实现只有一个按键的播放器
    virtualbox 打不开ubuntu解决
    wifi使用的一些误区
    Opencv step by step
  • 原文地址:https://www.cnblogs.com/binyuanxiang/p/11610658.html
Copyright © 2020-2023  润新知