美文网首页
Python学习笔记3-Numpy

Python学习笔记3-Numpy

作者: CrazyWolf_081c | 来源:发表于2018-12-17 16:44 被阅读17次

    Numpy

    学习莫烦python,非常感谢~记录自己在学习python过程中的点滴。

    Numpy 安装

    • Anaconda安装
    • pip安装

    Numpy的属性

    • ndim:维度
    • shape:行数和列数
    • size:元素个数

    参考代码:

    import numpy as np
    array = np.array([[1,2,3],
                      [4,5,6]])
    print(array)
    print('number of dim:',array.ndim)  # 维度
    print('shape :',array.shape)    # 行数和列数
    print('size:',array.size)   # 元素个数
    
    >>>
    [[1 2 3]
     [4 5 6]]
    number of dim: 2
    shape : (2, 3)
    size: 6
    

    Numpy创建array

    • array:创建数组
    • dtype:指定数据类型
    • zeros:创建数据全为0
    • ones:创建数据全为1
    • empty:创建数据接近0
    • arrange:按指定范围创建数据
    • linspace:创建线段
    • reshape:改变数据的形状

    创建数组:

    a = np.array([2,23,4])  # list 1d
    print(a)
    >>> 
    [2 23 4]
    

    指定数据类型:

    a = np.array([2,23,4],dtype=np.int)
    print(a.dtype)
    >>> 
    int 64
    
    a = np.array([2,23,4],dtype=np.float)
    print(a.dtype)
    >>> 
    float64
    

    创建特定数据:

    a = np.array([[2,23,4],[2,32,4]])  # 2d 矩阵 2行3列
    print(a)
    >>>
    [[ 2 23  4]
     [ 2 32  4]]
    
    # 创建全零数组
    a = np.zeros((3,4)) # 数据全为0,3行4列
    >>>
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    
    # 创建全一数组, 同时也能指定这些特定数据的 dtype:
    a = np.ones((3,4),dtype = np.int)   # 数据为1,3行4列
    >>>
    array([[1, 1, 1, 1],
           [1, 1, 1, 1],
           [1, 1, 1, 1]])
    
    # 创建全空数组, 其实每个值都是接近于零的数:
    a = np.empty((2,3)) # 数据为empty,2行3列
    >>>
    array([[9.14670441e-312 9.14670441e-312 9.14684911e-312]
           [9.14669205e-312 9.14685891e-312 9.14670438e-312]])
    
    # 用 arange 创建连续数组:
    a = np.arange(10,20,2) # 10-19 的数据,2步长
    >>>
    array([10, 12, 14, 16, 18])
    
    # 使用 reshape 改变数据的形状
    a = np.arange(12).reshape((3,4))    # 3行4列,0到11
    >>>
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    # 用 linspace 创建线段型数据:
    a = np.linspace(1,10,6)    # 开始端1,结束端10,且分割成6个数据,生成线段
    >>>
    array([ 1.   2.8  4.6  6.4  8.2 10. ])
    
    # 同样也能进行 reshape 工作:
    a = np.linspace(1,10,6).reshape((2,3)) # 更改shape
    >>>
    array([[ 1.   2.8  4.6]
           [ 6.4  8.2 10. ]])
    

    Numpy 基础运算1

    Numpy官方英文教材

    • +:加法运算
    • -:减法运算
    • *:乘法运算,对应矩阵中的点乘
    • **:乘方运算
    • /:除法运算
    • //:整除运算,结果为整数
    • np.dot():矩阵乘法
    • np.sin():正弦运算,类似的还有cos(),tanh()等其他三角函数
    • np.sum():求和运算,类似的还有min(),max()等运算
    import numpy as np
    a=np.array([10,20,30,40])   # array([10, 20, 30, 40])
    b=np.arange(4)              # array([0, 1, 2, 3])
    
    c=a-b  # 减法
    >>>
    array([10, 19, 28, 37])
    
    c=a+b  # 加法   
    >>>
    array([10, 21, 32, 43])
    
    c=b**2  # 乘方
    >>>
    array([0, 1, 4, 9])
    
    c=10*np.sin(a)  
    >>>
    array([-5.44021111,  9.12945251, -9.88031624,  7.4511316 ])
    
    # 2维矩阵
    a=np.array([[1,1],[0,1]])
    b=np.arange(4).reshape((2,2))
    print(a)
    print(b)
    
    >>>
    array([[1, 1],
          [0, 1]])
    array([[0, 1],
          [2, 3]])
    
    # 矩阵乘法
    c_dot = np.dot(a,b)
    c_dot_2 = a.dot(b)
    
    >>>
    array([[2, 4],
          [2, 3]])
    array([[2, 4],       
          [2, 3]])
    
    # sum(), min(), max()的使用
    a=np.random.random((2,4))
    print(a)
    np.sum(a)   
    np.min(a)   
    np.max(a)   
    
    >>>
    array([[ 0.94692159,  0.20821798,  0.35339414,  0.2805278 ],
          [ 0.04836775,  0.04023552,  0.44091941,  0.21665268]])
    4.4043622002745959   
    0.23651223533671784
    0.90438450240606416
    
    # 坐标轴细节操作
    print("sum =",np.sum(a,axis=1))
    print("min =",np.min(a,axis=0))
    print("max =",np.max(a,axis=1))
    
    >>>
    sum = [ 1.96877324  2.43558896]
    min = [ 0.23651224  0.41900661  0.36603285  0.46456022]
    max = [ 0.84869417  0.9043845 ]
    

    Numpy 基础运算2

    • argmin():求矩阵中最小元素的索引
    • argmax():求矩阵中最大元素的索引
    • mean():求均值运算
    • median:求中位数运算
    • cumsum():累加和运算
    • diff():累差运算函数
    • nonzero():将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。
    • sort():排序操作,默认对每一行进行从小到大排序操作
    • transpose():转置操作,把矩阵进行转置
    • clip():修剪运算,把Array数值范围限定在Array_min,Array_max之间。

    参考代码:

    import numpy as np
    A = np.arange(2,14).reshape((3,4)) 
    
    # array([[ 2, 3, 4, 5]
    #        [ 6, 7, 8, 9]
    #        [10,11,12,13]])
    
    # 最大值最小值索引         
    print(np.argmin(A))    # 0
    print(np.argmax(A))    # 11
    
    # 平均值
    print(np.mean(A))        # 7.5
    print(np.average(A))     # 7.5
    print(A.mean())          # 7.5
    
    # 中位数
    print(A.median())       # 7.5
    
    # 累加函数
    print(np.cumsum(A)) 
    # [2 5 9 14 20 27 35 44 54 65 77 90]
    
    # 累差函数
    print(np.diff(A))    
    # [[1 1 1]
    #  [1 1 1]
    #  [1 1 1]]
    
    # nonzero()函数
    print(np.nonzero(A))    
    # (array([0,0,0,0,1,1,1,1,2,2,2,2]),array([0,1,2,3,0,1,2,3,0,1,2,3]))
    
    
    
    import numpy as np
    A = np.arange(14,2, -1).reshape((3,4)) 
    
    # array([[14, 13, 12, 11],
    #       [10,  9,  8,  7],
    #       [ 6,  5,  4,  3]])
    
    # 排序
    print(np.sort(A))    
    # array([[11,12,13,14]
    #        [ 7, 8, 9,10]
    #        [ 3, 4, 5, 6]])
    
    # 转置
    print(np.transpose(A))    
    print(A.T)
    # array([[14,10, 6]
    #        [13, 9, 5]
    #        [12, 8, 4]
    #        [11, 7, 3]])
    # array([[14,10, 6]
    #        [13, 9, 5]
    #        [12, 8, 4]
    #        [11, 7, 3]])
    
    # clip()函数
    print(A)
    # array([[14,13,12,11]
    #        [10, 9, 8, 7]
    #        [ 6, 5, 4, 3]])
    
    print(np.clip(A,5,9))    
    # array([[ 9, 9, 9, 9]
    #        [ 9, 9, 8, 7]
    #        [ 6, 5, 5, 5]])
    

    更多具体的使用细节请记得查阅Numpy官方英文教材

    Numpy 的索引

    • [index]:一维索引
    • [row][col]:二维索引,也可写成[row,col]

    一维索引:

    import numpy as np
    A = np.arange(3,15)
    # array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
             
    print(A[3])    # 6
    
    A = np.arange(3,15).reshape((3,4))
    """
    array([[ 3,  4,  5,  6]
           [ 7,  8,  9, 10]
           [11, 12, 13, 14]])
    """
             
    print(A[2])         
    # [11 12 13 14]
    

    二维索引:

    print(A[1][1])      # 8
    print(A[1, 1])      # 8
    print(A[1, 1:3])    # [8 9]
    
    # 使用for循环打印行
    for row in A:
        print(row)
    """    
    [ 3,  4,  5, 6]
    [ 7,  8,  9, 10]
    [11, 12, 13, 14]
    """
    # 使用for循环打印列
    for column in A.T:
        print(column)
    """  
    [ 3,  7,  11]
    [ 4,  8,  12]
    [ 5,  9,  13]
    [ 6, 10,  14]
    """
    
    # 迭代输出
    print(A.flatten())   
    # array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
    
    for item in A.flat:
        print(item)
        
    # 3
    # 4
    ……
    # 14
    

    Numpy array 合并

    • np.vstack():对矩阵进行上下合并
    • np.hstack():对矩阵进行左右合并
    • np.newaxis():添加维度,例如把list变为array
    • np.concatenate():对矩阵进行合并,可以指定合并维度
      参考代码:
    import numpy as np
    A = np.array([1,1,1])
    B = np.array([2,2,2])
    
    # 垂直(上下)合并          
    print(np.vstack((A,B)))    # vertical stack
    """
    [[1,1,1]
     [2,2,2]]
    """
    # 水平(左右)合并
    D = np.hstack((A,B))       # horizontal stack
    print(D)
    # [1,1,1,2,2,2]
    
    # 增加维度
    print(A[np.newaxis,:])
    # [[1 1 1]]
    print(A[np.newaxis,:].shape)
    # (1,3)
    print(A[:,np.newaxis])
    """
    [[1]
    [1]
    [1]]
    """
    print(A[:,np.newaxis].shape)
    # (3,1)
    
    # 矩阵合并-纵向
    C = np.concatenate((A,B,B,A),axis=0)
    print(C)
    """
    array([[1],
           [1],
           [1],
           [2],
           [2],
           [2],
           [2],
           [2],
           [2],
           [1],
           [1],
           [1]])
    """
    # 矩阵合并-横向
    D = np.concatenate((A,B,B,A),axis=1)
    print(D)
    """
    array([[1, 2, 2, 1],
           [1, 2, 2, 1],
           [1, 2, 2, 1]])
    """
    

    Numpy array 分割

    • np.vsplit():对矩阵进行按行分割
    • np.hsplit():对矩阵进行按列分割
    • np.split():对矩阵进行按列分割,按照指定维度
    • np.array_split():对矩阵进行不等量分割

    参考代码:

    # 横向分割:从左到右分割(hsplit,axis=1)
    # 纵向分割:从上到下分割(vsplit,axis=0)
    
    import numpy as np
    A = np.arange(12).reshape((3, 4))
    print(A)
    """
    array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
    """
    
    # 纵向分割
    print(np.split(A, 2, axis=1))
    """
    [array([[0, 1],
            [4, 5],
            [8, 9]]), array([[ 2,  3],
            [ 6,  7],
            [10, 11]])]
    """
    # 横向分割
    print(np.split(A, 3, axis=0))
    # [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
    
    # 错误分割
    print(np.split(A, 3, axis=1))
    # ValueError: array split does not result in an equal division
    
    # 不等量分割
    print(np.array_split(A, 3, axis=1))
    """
    [array([[0, 1],
            [4, 5],
            [8, 9]]), array([[ 2],
            [ 6],
            [10]]), array([[ 3],
            [ 7],
            [11]])]
    """
    
    # 其他分割方式
    print(np.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0))
    # [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
    
    print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))
    """
    [array([[0, 1],
           [4, 5],
           [8, 9]]), array([[ 2,  3],
            [ 6,  7],
            [10, 11]])]
    """
    

    Numpy copy & deep copy

    • = 的赋值方式会带有关联性
    • copy() 的赋值方式没有关联性
      参考代码:
    import numpy as np
    a = np.arange(4)
    # array([0, 1, 2, 3])
    b = a
    
    a[0] = 11
    print(a)
    # array([11,  1,  2,  3])
    
    b is a  # True
    
    b[1:3] = [22, 33]   # array([11, 22, 33,  3])
    print(a)            # array([11, 22, 33,  3])
    print(b)            # array([11, 22, 33,  3])
    
    b = a.copy()    # deep copy
    print(b)        # array([11, 22, 33,  3])
    a[3] = 44
    print(a)        # array([11, 22, 33, 44])
    print(b)        # array([11, 22, 33,  3])
    

    再次感谢莫烦python

    相关文章

      网友评论

          本文标题:Python学习笔记3-Numpy

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