• Numpy基础


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

    1.ndarray的属性

    ndarray 对象是用于存放同类型元素的多维数组

    属性 作用
    ndim 返回int,表示数组的维数
    shape 返回tuple。表述数组的尺寸,对于n行m列的矩阵,形状为(n,m)
    size 返回int,表示数组的元素总数,等于数组形状的乘积
    dtype 返回data-type,描述数组中元素的类型
    itemsize 返回int,表示数组的每个元素的大小(以字节为单位)
    import numpy as np
    a=np.array([[1,2,3],[1,2,4]],dtype=np.float32)
    
    #数组元素总数
    print(a.size) #输出结果:6
    # 数组的形状,多少行多少列
    print(a.shape) #输出结果:(2,3)
    # 数组的维数
    print(a.ndim) #输出结果:2
    # 数组中元素类型
    print(a.dtype) #输出结果:float32
    

    2.修改ndarray的固有属性

    2.1 改变数组维度

    import numpy as np
    a=np.array([[1,2,3],[1,2,4]],dtype=np.float32)
    
    # 修改数组形状
    print(a.reshape(3,2))  
    '''
    输出结果为:
    [[1. 2.]
     [3. 1.] 
     [2. 4.]]
    '''
    

    3.生成特殊数组

    生成的所有数组都为ndarray类型,可构造数组:

    • 顺序数组
    • 等差数组
    • 等比数组
    • 全零多维数组
    • 单位多维数组
    • 对角线多维数组
    import numpy as np
    
    #生成顺序数组
    print(np.arange(10)) # 输出结果:[0 1 2 3 4 5 6 7 8 9]
    #创建等差数组
    print(np.linspace(0,10,10)) #输出结果:[ 0.  1.11111111  2.22222222  3.33333333  4.44444444  5.55555556  6.66666667  7.77777778  8.88888889 10. ]
    # 创建不包含结尾数字的等差数组
    print(np.linspace(0,10,10,endpoint=False)) # 输出结果:[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
    # 创建等比数列
    print(np.logspace(0,10,10,endpoint=False,base=2)) # 输出结果:[1.  2.  4.  8.  16.  32.  64.  128.  256.  512.]
    # 生成全0数组
    print(np.zeros(2)) # 输出结果:[0. 0.]
    # 生成两行三列的全0数组
    print(np.zeros((2,3))) 
    '''
    输出结果为:
    [[0. 0. 0.]
     [0. 0. 0.]]
    '''
    # 生成3阶单位数组
    print(np.eye(3))
    '''
    输出结果为:
    [[1. 0. 0.]
     [0. 1. 0.] 
     [0. 0. 1.]]
    '''
    # 生成元素值全为1的数组
    print(np.ones(2)) # 输出结果:[1. 1.]
    # 生成元素值全为1的数组
    print(np.ones((2,3))) 
    '''
    输出结果为:
    [[1. 1. 1.]
     [1. 1. 1.]]
    '''
    #生成指定对角线元素值的数组
    print(np.diag([1,3,7])) 
    '''
    输出结果为:
    [[1 0 0]
     [0 3 0] 
     [0 0 7]]
    '''
    

    4.生成随机数数组

    生成的所有数组都为ndarray类型,可生成随机数数组:

    • 0-1之间的随机数一维数组
    • 0-1之间的随机数多维数组
    • 均匀分布的随机数多维数组
    • 正态分布的随机数多维数组
    • 0-10之间的随机数多维数组
    import numpy as np
    
    # 生成4个0-1之间的随机数数组
    print(np.random.random(size=4)) #输出结果:[0.71768555 0.5947797  0.79972761 0.50824454]
    # 生成0-1之间的随机数矩阵
    print(np.random.random(size=(2,3)))
    '''
    输出结果为:
    [[0.32749832 0.04388334 0.56163757]
     [0.4309314  0.0344187  0.34532551]]
    '''
    # 生成4个均匀分布的随机数矩阵
    print(np.random.rand(2,3,2)) 
    '''
    输出结果为:
    [[[0.66295917 0.70471342]
      [0.05790362 0.49323016] 
      [0.10871097 0.64858176]] 
     [[0.07858738 0.63434474] 
      [0.537959   0.01110871]  
      [0.53534531 0.15553675]]]
    '''
    # 生成正态分布的随机数矩阵
    print(np.random.randn(2,3,2))
    '''
    输出结果为:
    [[[-1.31108764  0.09089742]
      [-0.17214132 -0.41071538] 
      [-0.06360873  0.65520704]] 
     [[-0.08087163  1.73616904]  
      [ 2.27342071 -0.23829859]  
      [ 0.73271656  1.0389563 ]]]
    '''
    # 随机生成0-10之间的2行3列随机数矩阵
    print(np.random.randint(0,10,size=(2,3)))
    '''
    输出结果为:
    [[2 6 5] 
     [5 6 1]]
    '''
    

    5.索引与切片

    5.1 一维的索引

    import numpy as np
    
    # 一维数组的索引
    a=np.arange(10) #a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # 数组的第三个值
    print(a[2])  #输出结果:2
    #数组从第三个值之后的值
    print(a[2:])  #输出结果:[2 3 4 5 6 7 8 9]
    #数组第六个值之前的值
    print(a[:5])  #输出结果:[0 1 2 3 4]
    #数组从第二个值到最后一个值
    print(a[1:-1])  #输出结果:[1 2 3 4 5 6 7 8]
    #数组从第二个值到最后一个值,其间步长为2
    print(a[1:-1:2])  #输出结果:[1 3 5 7]
    

    5.2 多维的索引

    前为行,后为列,然后各自看切片

    import numpy as np
    
    # 多维数组的索引
    b=np.random.randint(0,10,size=(2,3))
    '''
    输出结果为:
    [[4 6 7] 
     [8 2 4]]
    '''
    # 输出第二行所有元素
    print(b[1,:]) #输出结果:[8 2 4]
    #输出第一列所有元素
    print(b[:,0]) #输出结果:[4 8]
    #行上全取,列上使用步长为2进行取
    print(b[:,::2])
    '''
    输出结果为:
    [[4 7] 
     [8 4]]
    '''
    

    6.降维

    import numpy as np
    
    # 多维数组的索引
    b=np.random.randint(0,10,size=(2,3)) #输出结果:[[2 8 5] [6 6 3]]
    # 展开多维数组变为一维数组
    print(b.ravel()) #输出结果:[2 8 5 6 6 3]
    

    7.矩阵化

    7.1 矩阵化的方式

    import numpy as np
    
    #创建矩阵
    print(np.mat([[1,2],[3,4]]))
    '''
    输出为:
    [[1 2]
     [3 4]]
    '''
    #创建矩阵
    print(np.matrix([[11,21],[31,41]]))
    '''
    输出为:
    [[11 21]
     [31 41]]
    '''
    

    7.2 矩阵拼接

    import numpy as np
    
    
    a=np.mat([[1,2],[3,4]])
    '''
    输出为:
    [[1 2]
     [3 4]]
    '''
    b=np.matrix([[11,21],[31,41]])
    '''
    输出为:
    [[11 21]
     [31 41]]
    '''
    #横向合成矩阵
    print(np.bmat('a b'))
    '''
    输出为:
    [[ 1  2 11 21]
     [ 3  4 31 41]]
    '''
    

    7.3 矩阵乘法

    import numpy as np
    a=[[1,2],[3,4]]
    '''
    输出为:
    [[1 2]
     [3 4]]
    '''
    b=[[1,1],[1,1]]
    '''
    输出为:
    [[1 1]
     [1 1]]
    '''
    
    #作为矩阵相乘法一
    print(np.array(a).dot(np.array(b)))
    #作为矩阵相乘法二
    print(np.matrix(a)*np.matrix(b))
    '''
    输出为:
    [[3 3]
     [7 7]]
    '''
    

    7.4 矩阵转置

    import numpy as np
    a=np.mat([[1,1],[3,4]])
    '''
    输出为:
    [[1 1]
     [3 4]]
    '''
    #使用矩阵内置算法求逆
    print(a.T)
    '''
    输出为:
    [[1 3]
     [2 4]]
    '''
    

    8.拼接

    8.1 横向拼接

    import numpy as np
    
    #拼接数组
    a=np.arange(10).reshape(2,5)
    '''
    输出结果为
    [[0 1 2 3 4]
     [5 6 7 8 9]]
    '''
    
    b=np.linspace(0,1,endpoint=False,num=10).reshape(2,5)
    '''
    输出结果为
    [[0.  0.1 0.2 0.3 0.4]
     [0.5 0.6 0.7 0.8 0.9]]
    '''
    
    #横向拼接法一
    print(np.vstack((a,b)))
    #横向拼接法二
    print(np.concatenate((a,b),axis=0))
    '''
    输出结果为
    [[0.  1.  2.  3.  4. ]
     [5.  6.  7.  8.  9. ]
     [0.  0.1 0.2 0.3 0.4]
     [0.5 0.6 0.7 0.8 0.9]]
    '''
    

    8.2 纵向拼接

    import numpy as np
    
    #拼接数组
    a=np.arange(10).reshape(2,5)
    '''
    输出结果为
    [[0 1 2 3 4]
     [5 6 7 8 9]]
    '''
    b=np.linspace(0,1,endpoint=False,num=10).reshape(2,5)
    '''
    输出结果为
    [[0.  0.1 0.2 0.3 0.4]
     [0.5 0.6 0.7 0.8 0.9]]
    '''
    #纵向拼接法一
    print(np.hstack((a,b)))
    #纵向拼接法二
    print(np.concatenate((a,b),axis=1))
    '''
    输出结果为
    [[0.  1.  2.  3.  4.  0.  0.1 0.2 0.3 0.4]
     [5.  6.  7.  8.  9.  0.5 0.6 0.7 0.8 0.9]]
    '''
    

    9.分割

    9.1 横向分割

    import numpy as np
    
    a=np.arange(36).reshape(6,6)
    '''
    输出结果为:
    [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]
     [24 25 26 27 28 29]
     [30 31 32 33 34 35]]
    '''
    #横向分割数组法一
    print(np.hsplit(a,3))
    #横向分割数组法二
    print(np.split(a,3,axis=1))
    '''
    输出结果为:
    [array([[ 0,  1],
            [ 6,  7],
            [12, 13],
            [18, 19],
            [24, 25],
            [30, 31]]), 
     array([[ 2,  3],
            [ 8,  9],
            [14, 15],
            [20, 21],
            [26, 27],
            [32, 33]]),
     array([[ 4,  5],
            [10, 11],
            [16, 17],
            [22, 23],
            [28, 29],
            [34, 35]])]
    '''
    

    9.2 纵向分割

    import numpy as np
    
    a=np.arange(36).reshape(6,6)
    '''
    输出结果为:
    [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]
     [12 13 14 15 16 17]
     [18 19 20 21 22 23]
     [24 25 26 27 28 29]
     [30 31 32 33 34 35]]
    '''
    #纵向分割数组法一
    print(np.vsplit(a,3))
    #横向分割数组法二
    print(np.split(a,3,axis=0))
    '''
    输出结果为:
    [array([[ 0,  1,  2,  3,  4,  5],
            [ 6,  7,  8,  9, 10, 11]]),
     array([[12, 13, 14, 15, 16, 17],
            [18, 19, 20, 21, 22, 23]]), 
     array([[24, 25, 26, 27, 28, 29],
            [30, 31, 32, 33, 34, 35]])]
    '''
    

    10.数据读取和保存

    10.1 npy文件

    import numpy as np
    a=np.random.random((3,3))
    '''
    输出为:
    [[0.50212588 0.25281993 0.29829224]
     [0.73546263 0.28386965 0.68986956]
     [0.14592709 0.71318903 0.3625369 ]]
    '''
    #保存一个ndarray数组到npy文件
    np.save('./tmp/tmp.npy',a)
    #读取npy文件
    print(np.load('./tmp/tmp.npy'))
    '''
    输出为:
    [[0.50212588 0.25281993 0.29829224]
     [0.73546263 0.28386965 0.68986956]
     [0.14592709 0.71318903 0.3625369 ]]
    '''
    

    10.2 npz文件

    import numpy as np
    a=np.random.random((3,3))
    '''
    输出为:
    [[0.50212588 0.25281993 0.29829224]
     [0.73546263 0.28386965 0.68986956]
     [0.14592709 0.71318903 0.3625369 ]]
    '''
    b=np.random.randn(2,2)
    '''
    输出为:
    [[ 0.19706792 -0.74165399]
     [ 0.55448015  1.753524  ]]
    '''
    
    #保存多个ndarray数组到npz文件
    np.savez('./tmp/tmp2.npz',a,b)
    #读取npz文件
    d=np.load('./tmp/tmp2.npz')
    #展示有哪些ndarray数据
    print(d.files) #输出为:['arr_0', 'arr_1']
    #逐个展示npz文件里各个ndarray数据
    print(d['arr_0'])
    '''
    输出为:
    [[0.50212588 0.25281993 0.29829224]
     [0.73546263 0.28386965 0.68986956]
     [0.14592709 0.71318903 0.3625369 ]]
    '''
    print(d['arr_1'])
    '''
    输出为:
    [[ 0.19706792 -0.74165399]
     [ 0.55448015  1.753524  ]]
    '''
    

    10.3 txt文件

    import numpy as np
    
    a=np.random.random((3,3))
    '''
    输出为:
    [[0.51002495 0.64689764 0.97295432]
     [0.42998593 0.21590222 0.65957127]
     [0.13704206 0.55542585 0.525483  ]]
    '''
    np.savetxt('./tmp/tmp3.txt',a)
    
    #常规导入
    print(np.loadtxt('./tmp/tmp3.txt'))
    #可以进行填充缺失值的导入方式
    print(np.genfromtxt('./tmp/tmp3.txt'))
    '''
    输出为:
    [[0.51002495 0.64689764 0.97295432]
     [0.42998593 0.21590222 0.65957127]
     [0.13704206 0.55542585 0.525483  ]]
    '''
    

    11.数据的处理

    11.1 乘法

    import numpy as np
    a=[[1,2],[3,4]]
    b=[[1,1],[1,1]]
    
    #作为二维数组进行相乘
    print(np.array(a)*np.array(b))
    '''
    输出为:
    [[1 2]
     [3 4]]
    '''
    

    11.2 广播计算

    import numpy as np
    
    #广播计算
    a=[[0]*3,[1]*3,[2]*3,[3]*3]
    print(a)
    '''
    输出为:
    [[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3]]
    '''
    print(np.array(a)+np.array([1,2,3]))
    '''
    输出为:
    [[1 2 3]
     [2 3 4]
     [3 4 5]
     [4 5 6]]
    '''
    print(np.array(a)+np.array([[1],[2],[3],[4]]))
    '''
    输出为:
    [[1 1 1]
     [3 3 3]
     [5 5 5]
     [7 7 7]]
    '''
    

    11.2 去重、排序、均值等计算

    import numpy as np
    
    #读取iris数据集里的数据,并对其进行排序,去重,并求出和,累积和,均值,标准差,方差,最小值,最大值
    data=np.loadtxt('./data/iris_sepal_length.csv')
    #进行排序
    data.sort()
    #数据去重
    data=np.unique(data)
    #求和
    print(np.sum(data)) #输出为:210.39999999999998
    print(np.cumsum(data))
    '''
    输出为:
    [  4.3   8.7  13.2  17.8  22.5  27.3  32.2  37.2  42.3  47.5  52.8  58.2
      63.7  69.3  75.   80.8  86.7  92.7  98.8 105.  111.3 117.7 124.2 130.8
     137.5 144.3 151.2 158.2 165.3 172.5 179.8 187.2 194.8 202.5 210.4]
    '''
    print(np.mean(data)) #求均值 输出为:6.011428571428571
    print(np.std(data)) #求标准差 输出为:1.0289443768310533
    print(np.var(data)) #求方差 输出为:1.0587265306122449
    print(np.min(data)) #求最小值 输出为:4.3
    print(np.max(data)) #求最大值 输出为:7.9
    

    12.参考文章

    菜鸟教程-Numpy

    【创作不易,望点赞收藏,若有疑问,请留言,谢谢】

  • 相关阅读:
    由asp的一个错误,看语言的不同:asp & java
    chrome 显示图片遇到的问题,与 淘宝图片服务器 缓存 有关系
    asp 调用 vb(activex dll) ,参数传递(传引用)需要注意
    asp <----> vb(com,dll) <---> c 来回的调用,生命在于折腾
    HTTP/1.1 100 Continue
    java 线程栈 & java.lang.StackOverflowError
    硬盘分区的意义
    硬盘性能 & 文件碎片的一些思考
    Java并发——ReentrantLock类源码阅读
    使用Windows的NAT功能
  • 原文地址:https://www.cnblogs.com/dongxuelove/p/16422213.html
Copyright © 2020-2023  润新知