美文网首页
Numpy包的一些简单使用

Numpy包的一些简单使用

作者: 李白开水 | 来源:发表于2021-01-04 16:44 被阅读0次

    一、安装

    Windows安装:

    pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    二、Numpy使用

    使用要先导入包

    import numpy as np
    

    2.1. numpy的基础

    # 创建一个数组
    array01 = np.array([[1, 2, 3], [1, 2, 3]])
    # 打印后没有逗号来分隔列表
    print("array01", array01)
    # 结果
    array01 [[1 2 3]
     [1 2 3]]
    
    # 数组的维度
    print("number of dim:", array01.ndim)
    # 结果
    number of dim: 2
    
    # 数组的行和列(形状)
    print("shape", array01.shape)
    # 结果
    shape (2, 3)
    
    # 数组元素的总个数,相当于 .shape 中 n*m 的值
    print("size", array01.size)
    # 结果
    size 6
    
    # dtype:对象的元素类型
    array02 = np.array([1, 2, 3], dtype=int)
    # 打印矩阵的类型
    print(array02.dtype)
    # 结果
    int32
    
    # 打印一个全部为0的矩阵,参数为矩阵的shape,要用()或[]的形式填写
    # array03 = np.zeros((3, 3))
    array03 = np.zeros([3])
    print("array03", array03)
    # 结果
    array03 [0. 0. 0.]
    
    print(array03.dtype)
    # 结果
    float64
    
    # 打印一个全部为1的矩阵,参数为矩阵的shape,要用()或[]的形式填写
    array04 = np.ones((3, 3))
    print("array04", array04)
    # 结果
    array04 [[1. 1. 1.]
     [1. 1. 1.]
     [1. 1. 1.]]
    
    print(array04.dtype)
    # 结果
    float64
    
    # 打印一个未初始化的数组,参数为矩阵的shape,要用()或[]的形式填写,打印出的数是一个无限接近0的数
    array05 = np.empty((3, 3), dtype=float, order='C')
    print("array05", array05)
    # 结果
    array05 [[1. 1. 1.]
     [1. 1. 1.]
     [1. 1. 1.]]
    
    print(array05.dtype)
    # 结果
    float64
    
    # 打印一个有序数组,数组的值是从0到11
    array06 = np.arange(12)
    print("array06", array06)
    # 结果
    array06 [ 0  1  2  3  4  5  6  7  8  9 10 11]
    
    # 打印一个有序数组,数组的值是从2到20,步长为3
    array07 = np.arange(2, 21, 3)
    print("array07", array07)
    # 结果
    array07 [ 2  5  8 11 14 17 20]
    
    # 打印一个有序数组,数组的值是从2到100,步长为3,重新定义shape
    array08 = np.arange(2, 101, 3).reshape((3, 11))
    print("array08", array08)
    # 结果
    array08 [[ 2  5  8 11 14 17 20 23 26 29 32]
     [35 38 41 44 47 50 53 56 59 62 65]
     [68 71 74 77 80 83 86 89 92 95 98]]
    
    # numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的
    # 也可以reshape
    array09 = np.linspace(1, 10, 3)
    print("array09", array09)
    # 结果
    array09 [ 1.   5.5 10. ]
    

    2.2. numpy基础运算

    # 相减,相减的两个数组shape要一致
    array01 = np.array([1, 2, 3, 4, 5, 6, 7])
    array02 = np.arange(7)
    array03 = array02 - array01
    print(array03)
    
    # array01 [1 2 3 4 5 6 7]
    # array02 [0 1 2 3 4 5 6]
    # 结果
    [-1 -1 -1 -1 -1 -1 -1]
    
    # 相加,相加的两个数组shape要一致
    array01 = np.array([1, 2, 3, 4, 5, 6, 7])
    array02 = np.arange(7)
    array03 = array02 + array01
    print(array03)
    
    # array01 [1 2 3 4 5 6 7]
    # array02 [0 1 2 3 4 5 6]
    # 结果
    [ 1  3  5  7  9 11 13]
    
    # 平方/幂
    array01 = np.arange(7)
    array02 = array01 ** 2
    print("array02", array02)
    
    # array01 [0 1 2 3 4 5 6]
    # 结果
    array02 [ 0  1  4  9 16 25 36]
    
    # sin/cos
    array01 = np.arange(7)
    array02 = np.sin(array01)
    print("array02", array02)
    
    # array01 [0 1 2 3 4 5 6]
    # 结果
    array02 [ 0.          0.84147098  0.90929743  0.14112001 -0.7568025  -0.95892427
     -0.2794155 ]
    
    # 打印多少个值小于3
    array01 = np.arange(7)
    print(array01 < 3)
    
    # array01 [0 1 2 3 4 5 6]
    # 结果
    [ True  True  True False False False False]
    # 就是说如果小于3,对应的位置是True,如果不是,则是False
    
    # 逐个相乘
    array01 = np.arange(7)
    array02 = np.arange(7)
    print(array01 * array02)
    
    # array01 [0 1 2 3 4 5 6]
    # array02 [0 1 2 3 4 5 6]
    # 结果
    [ 0  1  4  9 16 25 36]
    
    # 矩阵乘法
    array01 = np.arange(7)
    array02 = np.arange(7)
    # 以下两种写法作用相同
    print(np.dot(array01, array02))
    print(array01.dot(array02))
    
    # array01 [0 1 2 3 4 5 6]
    # array02 [0 1 2 3 4 5 6]
    # 结果
    91
    91
    
    # 随机生成
    # random括号中是矩阵的shape
    array01 = np.random.random((2, 4))
    print(array01)
    
    # 结果
    [[0.49041883 0.65577959 0.0749789  0.25122033]
     [0.63311773 0.91115967 0.51406456 0.04068049]]
    
    # 数组的总和
    print(np.sum(array01))
    
    # array01 
    # [[0.49041883 0.65577959 0.0749789  0.25122033]
    # [0.63311773 0.91115967 0.51406456 0.04068049]]
    # 结果
    3.571420117123375
    
    # 数组的最大值
    print(np.max(array01))
    
    # array01 
    # [[0.49041883 0.65577959 0.0749789  0.25122033]
    # [0.63311773 0.91115967 0.51406456 0.04068049]]
    # 结果
    0.9111596735272833
    
    # 数组的最小值
    print(np.min(array01))
    
    # array01 
    # [[0.49041883 0.65577959 0.0749789  0.25122033]
    # [0.63311773 0.91115967 0.51406456 0.04068049]]
    # 结果
    0.04068048917507383
    
    # 指定维度axis,max、min、sum同理
    # axis:默认为列向(也即 axis=0),axis = 1 时为行方向的最值,也就是每一行会有一个最值,有多少行就有多少最值
    print(np.max(array01, axis=1))
    
    [0.65577959 0.91115967]
    
    A = np.arange(2, 14).reshape((3, 4))
    # 最小值的索引
    print(np.argmin(A))
    
    # A
    # [[ 2  3  4  5]
    # [ 6  7  8  9]
    # [10 11 12 13]]
    # 结果
    0
    
    # 打印平均值
    print(np.mean(A))
    print(A.mean())
    print(np.average(A))
    
    # A
    # [[ 2  3  4  5]
    # [ 6  7  8  9]
    # [10 11 12 13]]
    # 结果
    7.5
    7.5
    7.5
    
    # 中位数
    print(np.median(A))
    
    # A
    # [[ 2  3  4  5]
    # [ 6  7  8  9]
    # [10 11 12 13]]
    # 结果
    7.5
    
    """
    累加
    0100numpy.cumsum(a, axis=None, dtype=None, out=None)
    axis=0,按照行累加。
    axis=1,按照列累加。
    axis不给定具体值,就把numpy数组当成一个一维数组。
    第一位输出A数组的第一位,第二位是A数组的第一位+第二位,第三位是A数组的第一位+第二位+第三位,以此类推。。。
    """
    print(np.cumsum(A))
    
    # A
    # [[ 2  3  4  5]
    # [ 6  7  8  9]
    # [10 11 12 13]]
    # 结果
    [ 2  5  9 14 20 27 35 44 54 65 77 90]
    
    """
    累差
    后一个元素减去前一个元素
    """
    print(np.diff(A))
    
    # A
    # [[ 2  3  4  5]
    # [ 6  7  8  9]
    # [10 11 12 13]]
    # 结果
    [[1 1 1]
     [1 1 1]
     [1 1 1]]
    # 原来矩阵一行是四个数,计算结果一行为三个数
    
    """
    找出非零的数
    输出结果如下
    (array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
    会输出两个数组,第一个数组代表所有不为零的横坐标,第二个数组是纵坐标,对照着看
    也就是说,A数组,所有不为零的数的下标为(0,0),(0,1),(0,2),(0,3),(1,0)....
    """
    print(np.nonzero(A))
    
    # A
    # [[ 2  3  4  5]
    # [ 6  7  8  9]
    # [10 11 12 13]]
    # 结果
    (array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
    
    # 反向,行变成列,列变成行
    # 使用的时候数组必须是二维的,如果是一维的是没有用的
    print(np.transpose(A))
    print(A.T)
    
    # A
    # [[ 2  3  4  5]
    # [ 6  7  8  9]
    # [10 11 12 13]]
    # 结果
    [[ 2  6 10]
     [ 3  7 11]
     [ 4  8 12]
     [ 5  9 13]]
    
    [[ 2  6 10]
     [ 3  7 11]
     [ 4  8 12]
     [ 5  9 13]]
    
    # clip
    # 所有小于5的数都变成是5,所有大于9的数字都变为9
    print(np.clip(A, 5, 9))
    
    # A
    # [[ 2  3  4  5]
    # [ 6  7  8  9]
    # [10 11 12 13]]
    # 结果
    [[5 5 5 5]
     [6 7 8 9]
     [9 9 9 9]]
    
    # 排序
    B = np.random.random((3, 5))
    print(B)
    print(np.sort(B))
    """
    计算的时候可以指定是对于行计算还是对于列计算
    axis=0,按照行计算
    axis=1,按照列计算
    """
    # 结果
    [[0.70056206 0.08774181 0.74982551 0.06551736 0.18228322]
     [0.91882845 0.95398492 0.68164948 0.12950223 0.17427662]
     [0.39897969 0.1183171  0.05720491 0.8894308  0.81844583]]
    
    [[0.06551736 0.08774181 0.18228322 0.70056206 0.74982551]
     [0.12950223 0.17427662 0.68164948 0.91882845 0.95398492]
     [0.05720491 0.1183171  0.39897969 0.81844583 0.8894308 ]]
    

    2.3. numpy的索引

    A = np.arange(3, 15)
    print(A[2])
    
    # A [ 3  4  5  6  7  8  9 10 11 12 13 14]
    # 结果
    5
    
    B = np.arange(3, 15).reshape((3, 4))
    print(B[2])
    
    # B
    # [[ 3  4  5  6]
    # [ 7  8  9 10]
    # [11 12 13 14]]
    # 结果
    [11 12 13 14]
    
    # 以下两种方式等同
    print(B[2][1])
    print(B[2, 1])
    
    # B
    # [[ 3  4  5  6]
    # [ 7  8  9 10]
    # [11 12 13 14]]
    # 结果
    12
    12
    
    # 代表第三行的所有数
    print(B[2, :])
    
    # B
    # [[ 3  4  5  6]
    # [ 7  8  9 10]
    # [11 12 13 14]]
    # 结果
    [11 12 13 14]
    
    # 第二列的所有数
    print(B[:, 1])
    
    # B
    # [[ 3  4  5  6]
    # [ 7  8  9 10]
    # [11 12 13 14]]
    # 结果
    [ 4  8 12]
    
    # 代表第二行的第二到第四个数(包含第二个数,不包含第四个数)
    print(B[1, 1:3])
    
    # B
    # [[ 3  4  5  6]
    # [ 7  8  9 10]
    # [11 12 13 14]]
    # 结果
    [8 9]
    
    # 循环
    # 打印每一行
    for row in B:
        print(row)
    
    # B
    # [[ 3  4  5  6]
    # [ 7  8  9 10]
    # [11 12 13 14]]
    # 结果
    [3 4 5 6]
    [ 7  8  9 10]
    [11 12 13 14]
    
    # B
    # [[ 3  4  5  6]
    # [ 7  8  9 10]
    # [11 12 13 14]]
    
    # 没有迭代列,但是可以通过迭代B的transpose的行,达到迭代B的列的目的
    print(B.T)
    # 结果
    [[ 3  7 11]
     [ 4  8 12]
     [ 5  9 13]
     [ 6 10 14]]
    
    for column in B.T:
        print(column)
    
    # 结果
    [ 3  7 11]
    [ 4  8 12]
    [ 5  9 13]
    [ 6 10 14]
    
    print(B.flat)
    print(B.flatten())
    
    # 结果
    <numpy.flatiter object at 0x000001D590A53C60>
    
    [ 3  4  5  6  7  8  9 10 11 12 13 14]
    
    # 打印B元素的每一项
    for item in B.flat:
        print(item)
    
    # B
    # [[ 3  4  5  6]
    # [ 7  8  9 10]
    # [11 12 13 14]]
    # 结果
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    

    2.4. numpy数组的合并

    A = np.array([1, 1, 1])
    B = np.array([2, 2, 2])
    # 上下合并,就是把A和B合并成一个2*3的二维数组
    C = np.vstack((A, B))
    print(C.shape)
    
    # A [1 1 1]
    # B [2 2 2]
    # C 
    # [[1 1 1]
    # [2 2 2]]
    # 结果
    (2, 3)
    
    # 左右合并
    D = np.hstack((A, B))
    print(D.shape)
    
    # A [1 1 1]
    # B [2 2 2]
    # D [1 1 1 2 2 2]
    # 结果
    (6,)
    
    """
    为数组多加一个轴
    可以把[1,1,1]的数组变为
    [[1]
     [1]
     [1]]
    """
    print(A[:, np.newaxis])
    
    # A [1 1 1]
    # 结果
    [[1]
     [1]
     [1]]
    
    A = np.array([1, 1, 1])[:, np.newaxis]
    B = np.array([2, 2, 2])[:, np.newaxis]
    C = np.vstack((A, B))
    print(C.shape)
    
    # A 
    # [[1]
    # [1]
    # [1]]
    
    # B
    # [[2]
    #  [2]
    #  [2]]
    
    # C
    # [[1]
    #  [1]
    #  [1]
    #  [2]
    #  [2]
    #  [2]]
    
    # 结果
    (6, 1)
    
    D = np.hstack((A, B))
    print(D.shape)
    
    # A 
    # [[1]
    # [1]
    # [1]]
    
    # B
    # [[2]
    #  [2]
    #  [2]]
    
    # D
    # [[1 2]
    #  [1 2]
    #  [1 2]]
    
    # 结果
    (3, 2)
    
    # 多个数组合并
    print(np.concatenate((A, B, A, B, B), axis=0))
    print(np.concatenate((A, B, A, B, B), axis=1))
    
    # 结果
    [[1]
     [1]
     [1]
     [2]
     [2]
     [2]
     [1]
     [1]
     [1]
     [2]
     [2]
     [2]
     [2]
     [2]
     [2]]
    
    [[1 2 1 2 2]
     [1 2 1 2 2]
     [1 2 1 2 2]]
    

    2.5. numpy数组分割

    A = np.arange(12).reshape((3, 4))
    print(A)
    
    # 结果
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    
    # 1为纵向分割,分割成2等段
    print(np.split(A, 2, axis=1))
    
    # A
    # [[ 0  1  2  3]
    # [ 4  5  6  7]
    # [ 8  9 10 11]]
    # 结果
    [array([[0, 1],
           [4, 5],
           [8, 9]]), array([[ 2,  3],
           [ 6,  7],
           [10, 11]])]
    
    # 0为横向分割,分割成3等段
    print(np.split(A, 3, axis=0))
    
    # A
    # [[ 0  1  2  3]
    # [ 4  5  6  7]
    # [ 8  9 10 11]]
    # 结果
    [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
    
    # 不等量的分割
    # 纵向分割,分割成不等的3段
    print(np.array_split(A, 3, axis=1))
    
    # A
    # [[ 0  1  2  3]
    # [ 4  5  6  7]
    # [ 8  9 10 11]]
    # 结果
    [array([[0, 1],
           [4, 5],
           [8, 9]]), array([[ 2],
           [ 6],
           [10]]), array([[ 3],
           [ 7],
           [11]])]
    
    # 其他分割方法
    print(np.vsplit(A, 3))
    print(np.hsplit(A, 2))
    
    # A
    # [[ 0  1  2  3]
    # [ 4  5  6  7]
    # [ 8  9 10 11]]
    # 结果
    [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
    
    [array([[0, 1],
           [4, 5],
           [8, 9]]), array([[ 2,  3],
           [ 6,  7],
           [10, 11]])]
    

    2.6. numpy深拷贝浅拷贝

    A = np.arange(4)
    print(A)
    
    # 结果
    [0 1 2 3]
    
    # 赋值
    B = A
    C = A
    D = A
    print(B, C, D)
    
    # 结果
    [0 1 2 3] [0 1 2 3] [0 1 2 3]
    
    A[0] = 11
    print(A)
    print(B, C, D)
    
    # 原来的A [0 1 2 3]
    # 结果
    [11  1  2  3]
    [11  1  2  3] [11  1  2  3] [11  1  2  3]
    
    # 深拷贝
    B = A.copy()
    
    # B [11  1  2  3]
    # A [11  1  2  3]
    A[1] = 232323
    print(A)
    print(B)
    
    # 结果
    [    11 232323      2      3]
    [11  1  2  3]
    

    相关文章

      网友评论

          本文标题:Numpy包的一些简单使用

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