• NumPy 数组应用初探


      NumPy是Python中科学计算的基本包。它是一个Python库,提供了一个多维数组对象,各种派生对象(如屏蔽数组和矩阵),以及对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅立叶变换、基本线性代数、基本统计操作、随机模拟等等。
      本文以二维数组为主体,以图文形式介绍 NumPy 的基本概念和操作。

    关于 NumPy 的 Nature 论文的主要图解

      论文地址:https://www.nature.com/articles/s41586-020-2649-2

    NumPy 的几个基本数组概念图

    在这里插入图片描述

    基于 NumPy 的 Python 数据与科学体系

    在这里插入图片描述

    数组基础

    import numpy as np
    
    • 1

    数组创建

    # 将 Python 列表转为数组
    D1 = np.array([1,2,3])
    # 创建 全 1 数组
    D2 = np.ones(3)
    # 创建 全 0 数组
    D3 = np.zeros(3)
    # 创建 全 2 数组
    D4 = np.full(3, 2)
    # 多维数组的创建类似。创建 2 × 3 的全 0 数组
    D5 = np.zeros((2,3))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    维度或轴

      NumPy 的 axis 定义了数组的维度或轴,并可通过 axis 对指定轴进行处理。NumPy 最多支持 32 个轴,也就是 32 维数据。
    在这里插入图片描述

    数组属性

    属性说明示例结果
    shape形状Data.shape(4, 5)
    ndim维度Data.ndim2
    dtype数据类型Data.dtype‘int32’
    itemsize每个元素的大小(字节)Data.itemsize4
    flags内存信息Data.flagsnumpy.core.multiarray.flagsobj
    real实数部分Data.real[0, 0]1
    imag虚数部分Data.imag[0, 0]0

    数字型数组数据类型统计

    名称描述范围识别码每个值内存占用(bytes)
    bool8(bool_)布尔型True 或 False(0 或 1)b1
    int88位整形-128 ~ 127i1
    int1616位整形-32768 ~ 32767i2
    int32(intc)32位整形-2147483648 ~ 2147483647i4
    int6464位整形-9223372036854775808 ~ 9223372036854775807i8
    uint88位无符号整形0 ~ 255u1
    uint1616位无符号整形0 ~ 65535u2
    uint32(uintc)32位无符号整形0 ~ 4294967295u4
    uint6464位无符号整形0 ~ 18446744073709551615u8
    float16半精度浮点数-65500.0 ~ 65500.0f2
    float32单精度浮点数-3.4028235e+38 ~ 3.4028235e+38f4
    float64(longdouble)双精度浮点数-1.7976931348623157e+308 ~1.7976931348623157e+308f8
    complex64单精度复数由两个单精度浮点数(实部和虚部)组成c8
    complex128(clongdouble)双精度复数由两个双精度浮点数(实部和虚部)组成c16

       此外, NumPy 还支持字符串、日期等非数字型数据,例如:object_、bytes_、str_、void、datetime64、timedelta64 等,这里不做列出。

    数组操作

    数组切片

    1. 取一个值
      在这里插入图片描述

    2. 取行(或列)——以取第一列为例
      在这里插入图片描述

    上述取法丢失了维度。保留维度的取法如下:

    在这里插入图片描述

    1. 取部分区域
      在这里插入图片描述

    2. 花式切片
      在这里插入图片描述

    形状变换

    1. 平铺数组
      在这里插入图片描述
    2. 转置数组
      在这里插入图片描述

    更多维度可参考:
    np.transpose (转置轴)
    np.rollaxis (滚动轴)
    np.moveaxis (移动轴)
    np.swapaxes (交换轴)
    np.expand_dims(增加空轴)
    np.squeeze (清除空轴)

    1. 更改形状
      在这里插入图片描述

    其他相关方法:
    np.resize (效果与 reshape 相同,但会修改原数据,慎用!)

    1. 反转数组

    在这里插入图片描述

    数组合并

    在这里插入图片描述

    在这里插入图片描述

    其他相关方法:
    np.vstack (垂直堆叠)
    np.hstack (水平堆叠)
    np.stack (堆叠)
    np.append(添加)
    np.insert (插入)

    数组扩展

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    数组分割

    在这里插入图片描述
    在这里插入图片描述

    其他相关方法:
    np.hsplit (水平分割)
    np.vsplit (垂直分割)
    np.delete (删除)

    掩膜数组

      被掩膜的值不会参与 NumPy 运算。
    在这里插入图片描述

    其他相关方法:
    np.ma.masked_all
    np.ma.masked_all_like
    np.ma.masked_array
    np.ma.masked_equal
    np.ma.masked_greater
    np.ma.masked_greater_equal
    np.ma.masked_inside
    np.ma.masked_invalid
    np.ma.masked_less
    np.ma.masked_less_equal
    np.ma.masked_not_equal
    np.ma.masked_object
    np.ma.masked_outside
    np.ma.masked_print_option
    np.ma.masked_singleton
    np.ma.masked_values
    np.ma.masked_where

    数组排序

    在这里插入图片描述

    其他相关方法:
    np.argsort (间接排序)
    np.lexsort (多键排序)
    np.searchsorted (查找排序)
    np.partition (局部排序)

    数学运算

    算数运算

    注意:参与运算的两个数带有维度(2维)(单个值除外)!

    1. 加、减、成、除(逻辑通用)(后同)
      在这里插入图片描述

    其他相关方法:
    np.add (加)
    np.subtract (减)
    np.multiply (成)
    np.divide (除)

    1. 取余、取整
      在这里插入图片描述

    其他相关方法:
    np.mod (取余)
    np.floor (向下取整)
    np.ceil (向上取整)
    np.round (四舍六入五成双)

    1. 其他运算

    以乘方运算示例

    在这里插入图片描述

    其他相关方法:
    np.power(平方)
    np.reciprocal(倒数)
    np.sqrt(开平方)

    三角函数类
    np.sin (正弦函数)
    np.cos (余弦函数)

    弧度与角度
    np.radians (角度转弧度)
    np.degrees (弧度转角度)

    1. 特殊值
         NumPy 的浮点数具有两个特殊值,分别为 np.nan(非数字)、np.inf(无穷)。并具有以下特征:
    1. np.nan 与任何数运算都等于 np.nan,包括 0 。

    在这里插入图片描述

    1. np.nan 与任何其他数的逻辑运算均为 False,包括它自己。

    在这里插入图片描述

    1. -np.inf 小于任何值,np.inf 大于任何值(不包括它自己和 np.nan)

    在这里插入图片描述

    1. -np.inf 与其他实数运算都等于-np.inf,np.inf 与其他实数运算都等于np.inf(不包括它自己和 np.nan)

    在这里插入图片描述

    1. -np.inf 和 np.inf 的四则运算

    在这里插入图片描述

    累积运算

    以累积求和为例

    在这里插入图片描述

    其他相关方法:
    np.nancumsum (忽略 nan 的累积求和)
    np.cumproduct(累积求积)
    np.cumprod(累积求积)
    np.nancumprod (忽略 nan 的累积求积)

    统计计算

    1. 统计量
      在这里插入图片描述

    其他统计量:
    np.max (最大值)
    np.mean(均值)
    np.ptp (极差)
    np.median (中位数)
    np.sum(求和)
    np.einsum (爱因斯坦求和约定)
    np.prod(求积)
    np.quantile (四分位数)
    np.percentile (百分位数)
    np.std (标准差)
    np.var (方差)

    逻辑判断

    在这里插入图片描述

    其他符号:<、<=、>=、==、!= …

    矩阵运算

    以矩阵乘法为例

    在这里插入图片描述

    其他方法:
    np.vdot (点积)
    np.inner (内积)
    np.outer (外积)
    np.diag (取对角)
    np.trace (迹)
    np.matmul (矩阵乘积)
    np.linalg.det (行列式)
    np.linalg.inv (逆矩阵)

    分段函数

    在这里插入图片描述

    其他方法:
    np.where
    np.select

    数组与栅格

      对于地理科学而言,栅格数据是经常用到的一类数据,其本质上就是一个2维(单波段)或3维(多波段)数组 + 地理信息(坐标系/投影、仿射变换等)+ 其他元数据构成的一个数据集。

       本处以 gma 为例,说明数组与栅格数据的关系。详情请参考:地理与气象分析库

       gma 库提供了栅格读取操作的全部过程,并提供标准化的栅格处理思路,可获取栅格数据的数据(数组)、地理信息和元数据,以及保存数据到栅格文件的全部流程。

    单波段文件

       假设有一个1波段的 GTiff 栅格数据文件。

    import gma
    DataSet = gma.Open('XXX.tif')
    Rows = DataSet.Rows
    Columns = DataSet.Columns
    Data = DataSet.ToArray()
    
    • 1
    • 2
    • 3
    • 4
    • 5

      其数据部分的组织形式可以为:
    在这里插入图片描述

    多波段文件

       假设有一个4波段的 GTiff 栅格数据文件。

    import gma
    DataSet = gma.Open('XXX.tif')
    Rows = DataSet.Rows
    Columns = DataSet.Columns
    Bands = DataSet.Bands
    Data = DataSet.ToArray()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

       其数据部分的组织形式可以为:
    在这里插入图片描述

    含有子数据集的科学数据集文件

       假设有一个含有2个子数据集的科学数据集(子数据集1包含4波段,子数据集2包含2个波段)的 netCDF 数据。

    import gma
    SDS = gma.Open('XXX.nc')
    # 第一个子数据集(DataSet 1)
    DataSet = SDS.GetSubDataSet(0)
    Rows = DataSet.Rows
    Columns = DataSet.Columns
    Bands = DataSet.Bands
    Data = DataSet.ToArray()
    # 第二个子数据集(DataSet 2)类似,不做说明
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    并非所有的 netCDF 数据都含有子数据集! 只具有 1 个子数据集的科学数据集需要以单波段或多波段栅格的方式读取。

       其数据部分的组织形式可以为:

    在这里插入图片描述

       此类数据每个数据集的组成数据(数组)的形状可能不同,因此无法一次性将所有数据读取为单一数组。gma 提供 子数据集类(SubDataSet),通过子数据集类分别获取每个数据集(DataSet),然后可利用普通栅格的方式读取和分析数据。

  • 相关阅读:
    常见关系型数据库SQL增删改查语句
    c#委托的三种实现方式
    Java安全之SnakeYaml反序列化分析
    专访|OpenTiny 社区 Mr 栋:结合兴趣,明确定位,在开源中给自己一些技术性挑战
    [动态规划]——线性DP(LIS/LCS/LCIS等) 详解
    通过maven命令手动上传jar私服Nexus
    springboot整合xxl-job详解(采坑记录)
    先验 & 后验 & 似然估计
    GZIP文件压缩
    AWS SAP-C02教程6--安全
  • 原文地址:https://blog.csdn.net/weixin_42155937/article/details/128078155