zoukankan      html  css  js  c++  java
  • numpy学习笔记.

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    

    一、数组的创建

    1. 创建二维数组

    np.array([
        [1,2,3],
        [4,6,8],
    ])
    
    array([[1, 2, 3],
           [4, 6, 8]])
    

    *数组宽度需要一致

    np.array([
        [1,2,3],
        [4,6,8,7],
    ])
    
    array([list([1, 2, 3]), list([4, 6, 8, 7])], dtype=object)
    

    2. 和python类似的range()函数

    np.arange(2, 6, 0.5)
    
    array([2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5])
    

    3. 创建元素全部为 1/0/随意/指定 的数组(ones、zeros、empty、full)

    np.ones(shape=(5,3))
    
    array([[1., 1., 1.],
           [1., 1., 1.],
           [1., 1., 1.],
           [1., 1., 1.],
           [1., 1., 1.]])
    
    np.ones_like(np.array([[1,2],[7,8]]))
    
    array([[1, 1],
           [1, 1]])
    

    创建不初始化的数组

    np.empty(shape=(3,2,2))
    
    array([[[0., 0.],
            [0., 0.]],
    
           [[0., 0.],
            [0., 0.]],
    
           [[0., 0.],
            [0., 0.]]])
    

    创建数组,指定形状和填充值

    np.full((3,4), 5)
    
    array([[5, 5, 5, 5],
           [5, 5, 5, 5],
           [5, 5, 5, 5]])
    

    单位矩阵

    np.eye(5)
    
    array([[1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 1.]])
    

    等差数列

    np.linspace(0, 20, num=11, endpoint=True)
    
    array([ 0.,  2.,  4.,  6.,  8., 10., 12., 14., 16., 18., 20.])
    

    等比数列

    np.logspace(1, 10, num=10, base=2)
    
    array([   2.,    4.,    8.,   16.,   32.,   64.,  128.,  256.,  512.,
           1024.])
    
    1. range和linspace都可以产生等差数列;

    2. arange指定的是步长,linspace和logspace指定的是区间内数值的个数。

    二、数组和列表

    array采用紧凑形式存储,即直接存储数据,而不是像列表一样存储地址

    这是图片

    1. 创建数组和列表,进行时间和空间衡量

    三、 数组运算

    支持矢量运算(广播运算,内存对齐)

    a = np.array([1,2,3])
    
    b = np.array([
        [7,2,6],
        [6,5,4]
    ])
    
    c = 3
    

    广播运算,对于形状不同的数组,进行扩展

    a+b+c
    
    array([[11,  7, 12],
           [10, 10, 10]])
    
    d = np.array([[1],[2],[3]])
    
    d+a
    
    array([[2, 3, 4],
           [3, 4, 5],
           [4, 5, 6]])
    

    并不是所有情况都可以广播运算,有的时候,广播也不能够形式相同

    np.array([1,2])+a
    
    ---------------------------------------------------------------------------
    
    NameError                                 Traceback (most recent call last)
    
    <ipython-input-1-d106fb5a0ffe> in <module>()
    ----> 1 np.array([1,2])+a
    
    
    NameError: name 'np' is not defined
    

    四、数据类型

    1. 指定数据类型

    np.array([1, 2.3, 2], dtype=np.float32)
    
    array([1. , 2.3, 2. ], dtype=float32)
    

    2. 更改数据类型

    a = np.array([1, 2.3, 2], dtype=np.float32)
    a.astype(np.int32)
    
    array([1, 2, 2], dtype=int32)
    
    a.dtype=np.int32
    a
    
    array([1065353216, 1075000115, 1073741824], dtype=int32)
    
    a = np.arange(24)
    a.reshape((3,8))
    
    array([[ 0,  1,  2,  3,  4,  5,  6,  7],
           [ 8,  9, 10, 11, 12, 13, 14, 15],
           [16, 17, 18, 19, 20, 21, 22, 23]])
    
    np.reshape(a, (3, -1))
    
    array([[ 0,  1,  2,  3,  4,  5,  6,  7],
           [ 8,  9, 10, 11, 12, 13, 14, 15],
           [16, 17, 18, 19, 20, 21, 22, 23]])
    

    五、 索引和切片

    5.1 reshape可以实现维数的改变

    a = np.arange(12)
    b=a.reshape((3,4))
    b
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    

    5.2 切片,返回原数组对象的视图,共享底层数据

    b[1:, 1:3]
    
    array([[ 5,  6],
           [ 9, 10]])
    
    切片,返回视图,如果改变底层数据,另外一个也会发生影响
    c = b[:]
    c[0, 0] = 777
    b
    
    array([[777,   1,   2,   3],
           [  4,   5,   6,   7],
           [  8,   9,  10,  11]])
    
    如果需要深拷贝,可以使用copy()
    c = b.copy()
    c[0, 0] = 888
    b
    
    array([[777,   1,   2,   3],
           [  4,   5,   6,   7],
           [  8,   9,  10,  11]])
    

    5.3 数组索引

    传入整形索引列表,返回的是新拷贝对象

    index = [5, 8, 2, 7]
    a[index]
    
    array([5, 8, 2, 7])
    
    创建一个bool数组,可以根据布尔数组选择元素
    age = np.array([15, 135, 56, 15, 65, 123, 156, 96, 61, 166, 41, 20])
    a[age>50]
    
    array([1, 2, 4, 5, 6, 7, 8, 9])
    

    *布尔数组元素个数必须和目标数组数量一致

    age1 = np.array([14, 135, 56, 35, 63, 123, 152, 96, 61, 162, 42, 20])
    age1 == age
    
    array([False,  True,  True, False, False,  True, False,  True,  True,
           False, False,  True])
    
    a[age1 == age]
    
    array([ 1,  2,  5,  7,  8, 11])
    
    a[(age1 == age) &  (age>50)]
    
    array([1, 2, 5, 7, 8])
    

    六、 数据扁平化

    ravel是浅拷贝, flatten是深拷贝

    a = np.arange(10).reshape(2,5)
    b = a.flatten()
    b[0] = 777
    a
    
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    
    c = a.ravel()
    c[0] = 777
    a
    
    array([[777,   1,   2,   3,   4],
           [  5,   6,   7,   8,   9]])
    

    reshape会把原数组扁平化后,再进行结构化

    a = np.arange(24)
    a.reshape((6,4), order='c')
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23]])
    
    a.reshape((6,4), order='f')
    
    array([[ 0,  6, 12, 18],
           [ 1,  7, 13, 19],
           [ 2,  8, 14, 20],
           [ 3,  9, 15, 21],
           [ 4, 10, 16, 22],
           [ 5, 11, 17, 23]])
    

    七、 统计函数

    • mean/sum
    • max/min
    • argmax/argmin
    • std/ver
    • consum/conprod
    a = np.array([
        [1,2,3],
        [8,6,1],
        [0,4,15],
        [8,52,32]
    ])
    
    a.shape
    
    (4, 3)
    

    很重要的一个概念:轴

    a.sum(axis=0)
    
    array([17, 64, 51])
    
    a.sum(axis=1)
    
    array([ 6, 15, 19, 92])
    

    当维度扩展到多维时,统计规则:

    按照指定轴下标索引的方向统计

    x = np.arange(24).reshape(2,3,4)
    x.shape
    
    (2, 3, 4)
    
    x.sum(axis=0)
    
    array([[12, 14, 16, 18],
           [20, 22, 24, 26],
           [28, 30, 32, 34]])
    
    x.mean(axis=1)
    
    array([[ 4.,  5.,  6.,  7.],
           [16., 17., 18., 19.]])
    

    八、随机函数

    1. 随机数

    np.random.rand() // 产生的区间为[0,1)
    
    0.5876140647572566
    
    np.random.rand(2,3,4)
    
    array([[[0.39923779, 0.54564034, 0.29082511, 0.55575218],
            [0.9706234 , 0.46321137, 0.53333865, 0.45499656],
            [0.59093915, 0.71118072, 0.20639271, 0.63456103]],
    
           [[0.43380432, 0.67861236, 0.90540132, 0.41274326],
            [0.33723336, 0.64989966, 0.54551242, 0.50927546],
            [0.42052748, 0.88828045, 0.63187932, 0.88410905]]])
    

    2. 标准正态分布

    np.random.rand(3,3)
    
    array([[0.4789705 , 0.06642018, 0.23518938],
           [0.38329877, 0.43547922, 0.28622591],
           [0.91541056, 0.04645713, 0.52973722]])
    

    3. 指定标准差和均值的正态分布

    np.random.normal(size=(2,3), loc=5, scale=5)
    
    array([[ 6.65254795,  4.86225972,  5.30554417],
           [ 7.78982908,  9.07412392, 16.97508793]])
    

    4. 随机整数

    np.random.seed(1)
    np.random.randint(5, 15, size=(8,8))
    
    array([[10, 13, 14, 10,  5,  5,  6, 12],
           [11, 14,  7,  9, 10,  7,  9,  7],
           [ 9, 12, 12, 14,  6, 12,  5, 11],
           [14, 14, 12, 11, 14,  6,  5,  6],
           [13, 13,  8, 14, 13, 12,  8, 11],
           [10,  6, 14,  8,  9, 13,  6,  9],
           [ 5,  8, 14,  7,  5,  9, 14,  7],
           [12, 12, 14, 13, 11, 14,  8, 12]])
    
    np.random.seed(1) // 设定相同的种子
    np.random.randint(5, 15, size=(8,8))
    
    array([[10, 13, 14, 10,  5,  5,  6, 12],
           [11, 14,  7,  9, 10,  7,  9,  7],
           [ 9, 12, 12, 14,  6, 12,  5, 11],
           [14, 14, 12, 11, 14,  6,  5,  6],
           [13, 13,  8, 14, 13, 12,  8, 11],
           [10,  6, 14,  8,  9, 13,  6,  9],
           [ 5,  8, 14,  7,  5,  9, 14,  7],
           [12, 12, 14, 13, 11, 14,  8, 12]])
    
    import random
    a = random.randrange(5, 15)
    b = random.randint(5, 15)
    a,b
    
    (13, 9)
    

    5. 洗牌

    a = np.arange(10)
    np.random.shuffle(a)
    a
    
    array([0, 7, 1, 3, 8, 2, 9, 5, 4, 6])
    

    6. 产生随机小数[a, b)

    np.random.uniform(2.1, 5.2)
    
    2.816147808859026
    

    九、 连接和拆分

    a = np.arange(12).reshape(3,2,2)
    b = np.arange(12, 24).reshape(3,2,2)
    c = np.concatenate((a,b), axis=2)
    c
    
    array([[[ 0,  1, 12, 13],
            [ 2,  3, 14, 15]],
    
           [[ 4,  5, 16, 17],
            [ 6,  7, 18, 19]],
    
           [[ 8,  9, 20, 21],
            [10, 11, 22, 23]]])
    
    np.split(c, 2, axis=2)  // 切割数量必须能整除,
    
    [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]]])]
    
    np.split(c, [3,], axis=2) // 还可以通过列表指定拆分位置,效果如[0-2][3-最后]  
    
    [array([[[ 0,  1, 12],
             [ 2,  3, 14]],
     
            [[ 4,  5, 16],
             [ 6,  7, 18]],
     
            [[ 8,  9, 20],
             [10, 11, 22]]]), array([[[13],
             [15]],
     
            [[17],
             [19]],
     
            [[21],
             [23]]])]
    

    十、其它函数

    a = np.arange(24).reshape(6,4)
    a.any()
    
    True
    
    a.all()
    
    False
    

    转置(颠倒下标)

    a
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23]])
    
    a.T
    
    array([[ 0,  4,  8, 12, 16, 20],
           [ 1,  5,  9, 13, 17, 21],
           [ 2,  6, 10, 14, 18, 22],
           [ 3,  7, 11, 15, 19, 23]])
    

    轴变换

    a = np.arange(24).reshape(2,3,4)
    a.transpose(2,0,1) 
    
    array([[[ 0,  4,  8],
            [12, 16, 20]],
    
           [[ 1,  5,  9],
            [13, 17, 21]],
    
           [[ 2,  6, 10],
            [14, 18, 22]],
    
           [[ 3,  7, 11],
            [15, 19, 23]]])
    

    十一、 运算

    1. 乘法

    a = np.arange(24).reshape(6,4)
    b = np.arange(24).reshape(4,6)
    c = 5
    d = np.arange(4).T
    
    np.dot(a,c)
    
    array([[  0,   5,  10,  15],
           [ 20,  25,  30,  35],
           [ 40,  45,  50,  55],
           [ 60,  65,  70,  75],
           [ 80,  85,  90,  95],
           [100, 105, 110, 115]])
    

    点积(dot 和 @)

    np.dot(a, b)
    
    array([[  84,   90,   96,  102,  108,  114],
           [ 228,  250,  272,  294,  316,  338],
           [ 372,  410,  448,  486,  524,  562],
           [ 516,  570,  624,  678,  732,  786],
           [ 660,  730,  800,  870,  940, 1010],
           [ 804,  890,  976, 1062, 1148, 1234]])
    
    a@d
    
    array([ 14,  38,  62,  86, 110, 134])
    
    a = np.arange(24).reshape(2,3,4)
    b = np.arange(24).reshape(2,4,3)
    a@b
    
    array([[[  42,   48,   54],
            [ 114,  136,  158],
            [ 186,  224,  262]],
    
           [[ 906,  960, 1014],
            [1170, 1240, 1310],
            [1434, 1520, 1606]]])
    

    注意:a的最后一维和b的倒数第二维长度相同才能点积

    (a@b).shape
    
    (2, 3, 3)
    

    十二、 排序

    • np.sort() 返回新对象
    • 对象.sort() 就地修改
    x = np.array([1,43,5,7,3,43,43])
    

    np.sort(对象)返回新对象

    y = np.sort(x)
    y
    
    array([ 1,  3,  5,  7, 43, 43, 43])
    
    x
    
    array([ 1, 43,  5,  7,  3, 43, 43])
    

    对象运用排序方法,返回原对象

    x.sort()
    x
    
    array([ 1,  3,  5,  7, 43, 43, 43])
    

    unique() 去重 & 排序

    np.unique(x)
    
    array([ 1,  3,  5,  7, 43])
    

    三目运算

    a = np.array([1,  3,  5,  7, 43])
    b = np.array([4,  2,  56,  2, 1])
    np.where(a>b, a, b)
    
    array([ 4,  3, 56,  7, 43])
    

    i/o操作

    a = np.arange(24).reshape(2,3,4)
    
    np.save("./" ,a)
    
    result = np.load("./.npy", )
    result
    
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
    
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    

    练习,读取图像

    a = plt.imread('/home/geoffrey/图片/baidu.png')
    
    a.shape
    
    (258, 540, 4)
    
    plt.imshow(a)
    plt.show()
    

    result = np.split(a, 3)
    
    img_black = np.full((500, 500),fill_value=255,  dtype=np.uint8)
    
    img_black
    
    array([[255, 255, 255, ..., 255, 255, 255],
           [255, 255, 255, ..., 255, 255, 255],
           [255, 255, 255, ..., 255, 255, 255],
           ..., 
           [255, 255, 255, ..., 255, 255, 255],
           [255, 255, 255, ..., 255, 255, 255],
           [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
    
    cv2.imshow('', img_black)
    cv2.WaitKey(0)
    
    ---------------------------------------------------------------------------
    
    AttributeError                            Traceback (most recent call last)
    
    <ipython-input-26-700b93714854> in <module>()
          1 cv2.imshow('', img_black)
    ----> 2 cv2.WaitKey(0)
    
    
    AttributeError: module 'cv2.cv2' has no attribute 'WaitKey'
    
    plt.imshow(img_black)
    
    <matplotlib.image.AxesImage at 0x7f544658d128>
  • 相关阅读:
    1114: 零起点学算法21——求平均值
    1113: 零起点学算法20——输出特殊值II
    1112: 零起点学算法19——输出特殊值
    1111: 零起点学算法18——3个数比较大小
    1110: 零起点学算法17——比较2个数大小
    1109: 零起点学算法16——鸡兔同笼
    1108: 零起点学算法15——交换变量
    1107: 零起点学算法14——三位数反转
    1106: 零起点学算法13——求2个时间之间的分钟数
    设计模式之—中介者模式<Mediator Pattern>
  • 原文地址:https://www.cnblogs.com/geoffreyone/p/9890484.html
Copyright © 2011-2022 走看看