• Numpy学习笔记


    一. 创建数组

    1. 使用 np.array() 由 python list 创建

    注意

    • numpy 默认使用 ndarray 的所有元素的类型是相同的

    • 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str -> float -> int

    • ndarray 的数据类型:

      int: int8、uint8、int16、int32、int64
      float: float16、float32、float64
      str: 字符串
      
    import numpy as np
    
    list1 = [1, 2, 3, 4, 5, 6]
    n = np.array(list1)
    print(n, type(n))  # [1 2 3 4 5 6] 
    
    # 元素类型优先级
    n = np.array([3.14, 2, 1, 'fg'])
    print(n)  # ['3.14' '2' '1' 'fg']
    
    # 数组的维度数包含在属性中。ndim
    # 数组的形状是非负整数的元组,用于指定沿每个维度的元素数。shape
    # 数组中固定的元素总数包含在属性中。size
    

    2. 使用 np 的常规函数创建

    • 创建一个所有元素都是1的多维数组
      np.ones(shape, dtype=None, order='C')

      shape:形状
      dtype=None:元素类型
      order: {'C', 'F'}:可选,默认值:C 是否在内存中以行主或列主 顺序存储多维数据,一般默认即可
      
    import numpy as np
    
    n = np.ones(5)
    print(n)
    
    # 创建2行3列都是1的数组
    n = np.ones((2, 3), dtype=int)
    print(n)
    
    n = np.zeros((3, 3), dtype=float)
    print(n)
    

    在这里插入图片描述

    • 创建一个所有元素都为指定元素的多维数组
      np.full(shape, fill_value, dtype=None, order='C')

      shape:形状
      fill_value:填充值
      dtype=None:元素类型
      
    import numpy as np
    
    n = np.full((2, 3, 4), 1)
    print(n)
    

    在这里插入图片描述

    • 创建对角线为1,其他位置为0的二维数组
      np.eye(N, M=None, k=0, dtype=float)
      N:行数
      M:列数,默认为None,表示与行数一样
      dtype=None:元素类型
      
    import numpy as np
    
    n = np.eye(3, 3, dtype=int)
    print(n)
    
    # 向右偏移1个位置
    n = np.eye(3, 3, k=1, dtype=int)
    print(n)
    # 向左偏移1个位置
    n = np.eye(3, 3, k=-1, dtype=int)
    print(n)
    

    在这里插入图片描述

    • 创建一个等差数列
      np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

       start:开始值
       stop:结束值
       num=50:等差数列中默认有50个数
       endpoint=True:是否包含结束值,默认包含
       retstep=False:是否返回等差值(步长)
       dtype=None:元素类型
      
    import numpy as np
    
    n = np.linspace(0, 100, num=51, retstep=True, dtype=int)
    print(n)
    

    在这里插入图片描述

    • 创建一个数值范围的数组
      np.arange([start,]stop, [step,], dtype=None)

      start :开始值(可选)
      stop:
      结束值(不包含)
      step:步⻓(可选)
      dtype=None:元素类型
      
    import numpy as np
    
    n = np.arange(1, 10, 2)
    print(n)  # 输出:[1 3 5 7 9]
    
    • 创建一个随机整数的多维数组
      np.random.randint(low, high=None, size=None, dtype=None)'

      low:最小值
      high:(1)high=None时,生成的数值在[0, low)区间内
      	  (2)使用high值时,生成的数值在[low, high)区间
      size=None:数组形状,默认只输出一个随机值
      
    import numpy as np
    import matplotlib.pyplot as plt
    
    n = np.random.randint(3)
    print(n)  # 输出一个0到2之间的随机整数
    
    n = np.random.randint(0, 10, 5)
    print(n)  # 输出一个包含5个0到9之间随机整数的数组
    
    n = np.random.randint(0, 10, (2, 3))
    print(n)  # 输出一个2行3列的矩阵,矩阵中的元素是0到9之间的随机整数
    
    n = np.random.randint(0, 10, (2, 3, 4))
    print(n)  # 输出一个3维数组,每个元素是0到9之间的随机整数
    
    # 20表示图像的高度(行数),40表示图像的宽度(列数),3表示每个像素的通道数。
    n = np.random.randint(0, 256, (20, 40, 3))
    plt.imshow(n)
    plt.show()  # 显示一个20行40列的彩色图像,每个像素的RGB值是0到255之间的随机整数。
    
    

    在这里插入图片描述

    • 创建一个服从标准正态分布的多维数组
      np.random.randn(d0, d1, ..., dn)

      import numpy as np
      n = np.random.randn(3, 4)
      print(n)  # 输出为服从标准正态分布的3行4列的二维数组
      
    • 创建一个服从正态分布的多维数组
      np.random.normal(loc=0.0, scale=1.0, size=None)

      loc=0.0:均值,对应着正态分布的中心
      scale:标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,反之越高瘦
      size=None:数组形状
      
    import numpy as np
    n = np.random.normal(170, 5, (3, 4))
    print(n)  # 输出为服从均值为170,标准差为5的3行4列的二维数组
    
    • 创建一个元素为0~1(左闭右开)的随机整数的多维数组
    import numpy as np
    
    n = np.random.random(size=(3, 4))
    print(n)  # 随机生成一个3行4列的数组
    
    n = np.random.rand(3, 4)
    print(n)  # 随机生成一个3行4列的数组
    
    

    二. ndarray的属性

    import numpy as np
    
    n = np.array([[[1, 2], [3, 4], [5, 6]]])
    print(n)
    # ndim 维度
    print(n.ndim)  # 3
    # shape 形状(各维度的长度)
    print(n.shape)  # (1, 3, 2)
    # size 数量(各维度长度的乘积)
    print(n.size)  # 6
    # dtype 数据类型
    print(n.dtype)  # int64
    
    

    三. ndarray的基本操作

    1. 索引

    import numpy as np
    
    n = np.array([1, 2, 3, 4, 5])
    print(n[2])  # 3
    
    n = np.array([[1, 2, 3], [4, 5, 6]])
    print(n[1, 2])  # 6
    print(n[1][2])  # 6
    
    n = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
    print(n[0, 0, 2])  # 3
    print(n[0][0][2])  # 3
    
    # 根据索引修改数据
    n[0, 0, 2] = 0
    n[0, 0] = [0, 0, 0]
    # 修改多行
    n[[[0, 1]]] = 2
    print(n)
    
    # 切片 [起始索引:结束索引+1:步长](默认值:0,-1,1)
    n = np.arange(5)
    print(n)  # [0 1 2 3 4]
    print(n[1:3])  # [1 2]
    print(n[::2])  # [0 2 4]
    print(n[::-1])  # [4 3 2 1 0]
    print(n[-1:-5:-1])  # [4 3 2 1]
    
    n = np.array([[1, 2, 3], [4, 5, 6]])
    print(n[::-1])  # 行翻转
    print(n[:, ::-1])  # 列翻转
    
    import matplotlib.pyplot as plt
    
    mm = plt.imread('4.jpg')
    plt.imshow(mm)
    # plt.show()
    
    # 上下翻转
    plt.imshow(mm[::-1])
    
    # 左右翻转
    plt.imshow(mm[::, ::-1])
    
    # 第三个维度翻转,颜色翻转,模糊处理
    plt.imshow(mm[::20, ::20, ::-1])
    plt.show()
    
    

    在这里插入图片描述

    2. 变形

    使用 reshape函数,注意参数是一个 tuple

    import numpy as np
    
    n = np.arange(1, 5)
    print(n)  # [1 2 3 4]
    print(n.shape)  # (4,)
    
    # 变成2维
    n2 = np.reshape(n, (2, 2))
    print(n2.shape)  # (2, 2)
    print(n2)
    
    # 变成1维
    print(n2.reshape(-1))  # [1 2 3 4]
    

    3. 级联

    import numpy as np
    
    n1 = np.array([[1, 2], [3, 4]])
    n2 = np.array([[5, 6], [7, 8]])
    
    # 上下合并:垂直级联
    print(np.concatenate((n1, n2), axis=0))
    # 左右合并:水平级联
    print(np.concatenate((n1, n2), axis=1))
    # 拼接:垂直级联
    print(np.vstack((n1, n2)))
    # 拼接:水平级联
    print(np.hstack((n1, n2)))
    

    在这里插入图片描述

    4. 拆分

    import numpy as np
    
    n = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
    
    # 垂直方向,
    print(np.vsplit(n, 2))
    print(np.split(n, 2, axis=0))
    # 水平方向
    print(np.hsplit(n, 2))
    print(np.split(n, 2, axis=1))
    

    在这里插入图片描述

    5. 拷贝、复制、副本

    import numpy as np
    
    # 赋值操作不行
    n1 = np.arange(5)
    n2 = n1
    n1[0] = 100
    print(n1, n2)
    
    # copy
    n1 = np.arange(5)
    n2 = n1.copy()
    n1[0] = 100
    print(n1, n2)
    

    在这里插入图片描述

    6. 转置

    n = np.array([[1, 2], [3, 4], [5, 6]])
    print(n.T)
    

    在这里插入图片描述

    四. ndarray的聚合操作

    import numpy as np
    import matplotlib.pyplot as plt
    
    n = np.array([1, 2, 3, 4, 5])
    print(np.sum(n))  # 15
    
    n = np.array([[1, 2], [3, 4], [5, 6]])
    print(np.sum(n))  # 21
    print(np.sum(n, axis=0))  # 行 [9 12]
    print(np.sum(n, axis=1))  # 列 [ 3  7 11]
    
    # 最大、小值
    print(np.max(n))  # 6
    print(np.min(n))  # 1
    
    # 最小数下标、最大数下标
    print(np.argmin(n))  # 0
    print(np.argmax(n))  # 5
    
    # 平均值
    print(np.mean(n))  # 3.5
    print(np.average(n))  # 3.5
    
    # 中位数
    print(np.median(n))  # 3.5
    
    # 标准差
    print(np.std(n))  # 1.707825127659933
    # 方差
    print(np.var(n))  # 2.9166666666666665
    # 次方
    print(np.power(n, 2))  # [[ 1  4]\n [ 9 16]\n [25 36]]
    
    # 按条件查找:返回满足条件的索引
    print(np.argwhere(n > 3))  # [[1 1]\n [2 0]\n [2 1]]
    

    广播机制:

    转载别人的笔记

    五. ndarray的矩阵操作

    import numpy as np
    
    n1 = np.array([[1, 2, 3,], [2, 3, 4]])
    n2 = np.array([[1, 2, 3], [3, 3, 4]])
    print(n1 - 1)
    print(n1 + n2)
    
    n1 = np.array([[1, 2, 3,], [2, 3, 4]])
    n2 = np.array([[1, 2], [3, 1], [3, 3]])
    # 矩阵乘积
    print(n1 @ n2)
    print(np.dot(n1, n2))
    
    n = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
    # 逆矩阵
    print(np.linalg.inv(n))
    # 求行列式
    print(np.linalg.det(n))  # 1
    # 求秩
    print(np.linalg.matrix_rank(n))  # 3
    

    六. ndarray的排序

    import numpy ad np
    
    n1 = np.array([1, 2, 8, 6, 5])
    print(np.sort(n1))  # [1 2 5 6 8]
    n1.sort()
    print(n1)  # [1 2 5 6 8]
    

    七. ndarray文件操作

    import numpy as np
    
    x = np.arange(0, 5)
    y = np.arange(5, 10)
    
    # save:保存ndarray到一个npy文件
    np.save('x.npy', x)
    
    # savez:保存多个ndarray到一个npz文件
    np.savez('xy.npz', xarr=x, yarr=y)
    
    # 读取文件
    print(np.load('x.npy'))  # [0 1 2 3 4]
    print(np.load('xy.npz')['yarr'])  # [5 6 7 8 9]
    
    # csv、txt文件的读写操作
    n = np.array([[1, 2, 3], [4, 5, 6]])
    
    # 存储数组到txt或csv,用delimiter为分隔符
    np.savetxt('n.txt', n, delimiter=',')
    np.savetxt('n.csv', n, delimiter=',')
    # 读取txt或csv文件
    print(np.loadtxt('n.txt', delimiter=','))  # [[1. 2. 3.], [4. 5. 6.]]
    print(np.loadtxt('n.csv', delimiter=','))  # [[1. 2. 3.], [4. 5. 6.]]
    
  • 相关阅读:
    探索SOCKS5与SK5代理在现代网络环境中的应用
    Linux 动、静态库原理深剖
    设计模式的思考(四)
    MongoDB之MongoDBConnectorBI安装与使用
    Easyx图形库趣味编程note3,多彩的颜色(画一道彩虹)
    笔试强训——day05
    Spring Security自定义验证码登录
    EE5805-Java-summary
    android事件分发机制详解
    力扣530 补9.12
  • 原文地址:https://blog.csdn.net/weixin_54418006/article/details/140438292