• 科学计算基础包--numpy


    一 numpy的简介

    NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。
    NumPy的主要功能:

    • ndarray, 一个多维数据结构, 高新且节省空间
    • 无需循环对数据进行快速运算的数学函数
    • 线性代数 随机数生成和傅里叶变换功能

    安装方法: pip install numpy
    引用方式: import numpy as np

    创建ndarray: np.adday(array_like)
    数组与列表的区别:

    • 数组对象内的元素类型必须相同
    • 数组大小不可修改

    二 Ipython的简介

    再详细介绍Numpy之前先简单介绍一个下Ipython以便后面的操作

     Ipython是再python环境下通过命令行交互式编程

    安装:pip install ipython

    使用:ipython

    与Python解释器使用方法一致

    1 高级功能

    TAB键自动完成

    ?:内省, 命名空间搜索

    !:执行系统命令

    丰富快捷键:

      

     2 魔术命令:以%开头

      %run:执行文件代码

      %paste:执行剪贴板代码

      %timeit:评估运行时间

      %pdb:自动调试

    三 Numpy的使用

    1 ndarray数据类型

    • 布尔型:bool_
    • 整形:int_ int8 int16 int32 int64
    • 无符号整形: unit8 unit16 unit32 unit 64
    • 浮点型:float float16 float32 float64
    • 复数型:complex_ complex64 complex128

    2 ndarray的常用属性

    • T 数组的转置(对高维数组而言)
    • size 数组元素的个数
    • ndim 数组的维数
    • shape 数组的维度大小(元祖形式)
    • dtype 数组元素的数据类型

    3 ndarray的创建

    • array() 将列表转换为数组, 可选择显示指定dtype
    • arange() range的numpy版, 支持浮点数
    • linespace() 类似arange(),第三个参数为数组长度
    • zeros() 根据指定形态和dtype创建全0数组
    • ones() 根据指定形态和dtype创建全1数组
    • empty() 根据指定形态和dtype创建空数组(随机值)
    • eye() 根据指定边长和dtyoe创建单位矩阵

    4 ndarray批量运算

      数组和标量之间的运算
      a+1 a*3 1//a a**0.5 a>5


      同样大小数组之间的运算
      a+b a/b a**b a%b a==b

    5 ndarray索引和切片

    一维数组的索引: a[5]
    多维数组的索引:

    • 列表式写法:a[2][3]
    • 新式写法:a[2,3]

    一维数组的切片: a[5:8]           a[4:]          a[2:10] = 1
    多维数组的切片:   a[1:2, 3:4]    a[:,3:5]      a[:,1]
    数组切片与列表切片的不同:数组切片时并不会自动复制(而是创建一个视图),在切片数组上的修改会影响原数组
    copy()方法可以创建数组的深拷贝

    6 ndarray布尔型索引 

    给定一个数组选出数组中所有大于5的偶数
      a[(a>5) & (a%2 == 0)]
    给一个数组, 选出数组中所有大于5的数和偶数
      a[(a>5) | (a%2==0)]

    7 ndarray花式索引

    对于一个数组,选出其第1,3,4,6,7个元素,组成新的二维数组
      a[[1,3,4,6,7]]
    对一个二维数组,选出其第一列和第三列, 组成新的二维数组
      a[:,[1,3]]

    ndarry通用函数

    通用函数:能同时对数组中所有元素进行运算的函数
    常见通用函数:

    • 一元函数: abs, sqrt, exp, log, ceil(向上取整), floor(向下取整), rint, trunc(向零取整), modf(将整数和小数分开), isnan(判断是不是nan), isinf(判断是不是inf), cos, sin, tan
    • 二元函数: add, substract, multiply, divide, power, mod, maximun, mininum

    补充-浮点数特殊值

    • nam(Not a Number):不等于任何浮点数(nan != nan)
    • inf(infinity): 比任何浮点数都大
    • NumPy中创建特殊值: np.nan np.inf
    • 在数据分析中, nan常被用作表示数据缺失值

    9 numpy数学和统计方法

    [1 2 3 4 5]

    • sum 求和
    • mean 求平均数
    • std 求标准差 ((1-3)**2+(2-3)**2+(3-3)**2+(4-3)**2+(5-3)**3)/5
    • var 求方差
    • min 求最小数
    • max 求最大值
    • argmin 求最小值索引
    • argmax 去最大值索引

    10 numpy随机数生成

    • 随机数函数在np.random子包内
    • rand 给定形态产生随机数组(0到1之间的数)
    • randint 给定形态产生随机整数
    • choice 给定形态产生随机选择
    • shuffle 与random.shuff相同
    • uniform 给定形态产生随机数组

    四 Numpy示例

    1. 使用np.array()创建

    np.array([1,2,3,4,5])
    array([1, 2, 3, 4, 5])
    二维数组创建
    np.array([[1,2,3],['a','b',1.1]])
    array([['1', '2', '3'],
           ['a', 'b', '1.1']], dtype='<U11')

    注意:

    • numpy默认ndarray的所有元素的类型是相同的
    • 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
    • 使用matplotlib.pyplot获取一个numpy数组,数据来源于一张图片

    2. 使用np的routines函数创建

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

    np.linspace(1,100,num=50)
    array([  1.        ,   3.02040816,   5.04081633,   7.06122449,
             9.08163265,  11.10204082,  13.12244898,  15.14285714,
            17.16326531,  19.18367347,  21.20408163,  23.2244898 ,
            25.24489796,  27.26530612,  29.28571429,  31.30612245,
            33.32653061,  35.34693878,  37.36734694,  39.3877551 ,
            41.40816327,  43.42857143,  45.44897959,  47.46938776,
            49.48979592,  51.51020408,  53.53061224,  55.55102041,
            57.57142857,  59.59183673,  61.6122449 ,  63.63265306,
            65.65306122,  67.67346939,  69.69387755,  71.71428571,
            73.73469388,  75.75510204,  77.7755102 ,  79.79591837,
            81.81632653,  83.83673469,  85.85714286,  87.87755102,
            89.89795918,  91.91836735,  93.93877551,  95.95918367,
            97.97959184, 100. ])

     np.arange([start, ]stop, [step, ]dtype=None)

    np.arange(1,100,2)
    array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33,
           35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67,
           69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99])

    np.random.randint(low, high=None, size=None, dtype='l')

    np.random.seed(10)
    arr = np.random.randint(0,100,size=(5,6))

    np.random.random(size=None)

    生成0到1的随机数,左闭右开 np.random.seed(3)

    np.random.random(size=(3,3))
    array([[0.765334  , 0.68742254, 0.12771576],
           [0.34878082, 0.46292111, 0.75355298],
           [0.08188152, 0.53189213, 0.17514265]])

    3 ndarray的属性

    4个必记参数:

    • ndim:维度
    • shape:形状(各维度的长度)
    • size:总长度 
    • dtype:元素类型
    img_arr.shape
    (626, 413, 3)
    img_arr.ndim
    3
    img_arr.size
    775614
    img_arr.dtype
    dtype('uint8')

    4 ndarray的基本操作

    索引

    一维与列表完全一致 多维时同理

    arr[[1,2]]
    array([[29,  8, 73,  0, 40, 36],
           [16, 11, 54, 88, 62, 33]])

    切片

    一维与列表完全一致 多维时同理

    #获取二维数组前两行
    arr[0:2]
    array([[ 9, 15, 64, 28, 89, 93],
           [29,  8, 73,  0, 40, 36]])
    #获取二维数组前两列
    arr[:,0:2]
    array([[ 9, 15, 64, 28, 89, 93],
           [29,  8, 73,  0, 40, 36]])
    #获取二维数组前两行和前两列数据
    arr[0:2,0:2]
    array([[ 9, 15],
           [29,  8]])
    #将数据反转,例如[1,2,3]---->[3,2,1]
    #将数组的行倒序
    arr[::-1]
    array([[69, 13, 25, 13, 92, 86],
           [72, 78, 49, 51, 54, 77],
           [16, 11, 54, 88, 62, 33],
           [29,  8, 73,  0, 40, 36],
           [ 9, 15, 64, 28, 89, 93]])
    
    #列倒序
    arr[:,::-1]
    array([[93, 89, 28, 64, 15,  9],
           [36, 40,  0, 73,  8, 29],
           [33, 62, 88, 54, 11, 16],
           [77, 54, 51, 49, 78, 72],
           [86, 92, 13, 25, 13, 69]])
    
    #全部倒序
    arr[::-1,::-1]
    array([[86, 92, 13, 25, 13, 69],
           [77, 54, 51, 49, 78, 72],
           [33, 62, 88, 54, 11, 16],
           [36, 40,  0, 73,  8, 29],
           [93, 89, 28, 64, 15,  9]])

    5 变形

    使用arr.reshape()函数,注意参数是一个tuple!

    将一维数组变形成多维数组

    arr_1.reshape((-1,15))
    array([[ 9, 15, 64, 28, 89, 93, 29,  8, 73,  0, 40, 36, 16, 11, 54],
           [88, 62, 33, 72, 78, 49, 51, 54, 77, 69, 13, 25, 13, 92, 86]])

    将多维数组变形成一维数组

    arr_1 = arr.reshape((30,))

     6 级联

    一维,二维,多维数组的级联,实际操作中级联多为二维数组

    array([[ 9, 15, 64, 28, 89, 93],
           [29,  8, 73,  0, 40, 36],
           [16, 11, 54, 88, 62, 33],
           [72, 78, 49, 51, 54, 77],
           [69, 13, 25, 13, 92, 86]])
    
    # 行级联
    np.concatenate((arr,arr),axis=1)
    array([[ 9, 15, 64, 28, 89, 93,  9, 15, 64, 28, 89, 93],
           [29,  8, 73,  0, 40, 36, 29,  8, 73,  0, 40, 36],
           [16, 11, 54, 88, 62, 33, 16, 11, 54, 88, 62, 33],
           [72, 78, 49, 51, 54, 77, 72, 78, 49, 51, 54, 77],
           [69, 13, 25, 13, 92, 86, 69, 13, 25, 13, 92, 86]])
    
    #列级联
    arr1 = np.random.randint(0,100,size=(5,5))
    arr1
    array([[30, 30, 89, 12, 65],
           [31, 57, 36, 27, 18],
           [93, 77, 22, 23, 94],
           [11, 28, 74, 88,  9],
           [15, 18, 80, 71, 88]])
    np.concatenate((arr,arr1),axis=0)

    级联需要注意的点:

    • 级联的参数是列表:一定要加中括号或小括号
    • 维度必须相同
    • 形状相符:在维度保持一致的前提下,如果进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致。如果进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致。
    • 可通过axis参数改变级联的方向

    6 ndarray的排序

    快速排序

    np.sort()与ndarray.sort()都可以,但有区别:

    • np.sort()不改变输入
    • ndarray.sort()本地处理,不占用空间,但改变
    np.sort(arr,axis=0)
    array([[ 9,  8, 25,  0, 40, 33],
           [16, 11, 49, 13, 54, 36],
           [29, 13, 54, 28, 62, 77],
           [69, 15, 64, 51, 89, 86],
           [72, 78, 73, 88, 92, 93]])
    
    arr.sort(axis=0)
    array([[ 9,  8, 25,  0, 40, 33],
           [16, 11, 49, 13, 54, 36],
           [29, 13, 54, 28, 62, 77],
           [69, 15, 64, 51, 89, 86],
           [72, 78, 73, 88, 92, 93]])
  • 相关阅读:
    线程交互
    线程死锁
    多线程的同步-sychronized
    线程常见方法
    创建多线程
    消费!
    Redis基本认识
    在右键菜单中加入"在IDEA中打开" (Open in IDEA)
    安装coc.nvim时 报[coc.nvim] javascript file not found 错误的解决方案
    汇编语言的种类
  • 原文地址:https://www.cnblogs.com/harryblog/p/10811549.html
Copyright © 2020-2023  润新知