图解 Numpy,让数据科学变得简单、直观、有趣~~

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

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

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

NumPy 的几个基本数组概念图

图解 Numpy,让数据科学变得简单、直观、有趣~~_第1张图片

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

图解 Numpy,让数据科学变得简单、直观、有趣~~_第2张图片

数组基础

import numpy as np

数组创建

# 将 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))

图解 Numpy,让数据科学变得简单、直观、有趣~~_第3张图片

维度或轴

  NumPy 的 axis 定义了数组的维度或轴,并可通过 axis 对指定轴进行处理。NumPy 最多支持 32 个轴,也就是 32 维数据。
图解 Numpy,让数据科学变得简单、直观、有趣~~_第4张图片

数组属性

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

数字型数组数据类型统计

名称 描述 范围 识别码 每个值内存占用(bytes)
bool8(bool_) 布尔型 True 或 False(0 或 1) b 1
int8 8位整形 -128 ~ 127 i 1
int16 16位整形 -32768 ~ 32767 i 2
int32(intc) 32位整形 -2147483648 ~ 2147483647 i 4
int64 64位整形 -9223372036854775808 ~ 9223372036854775807 i 8
uint8 8位无符号整形 0 ~ 255 u 1
uint16 16位无符号整形 0 ~ 65535 u 2
uint32(uintc) 32位无符号整形 0 ~ 4294967295 u 4
uint64 64位无符号整形 0 ~ 18446744073709551615 u 8
float16 半精度浮点数 -65500.0 ~ 65500.0 f 2
float32 单精度浮点数 -3.4028235e+38 ~ 3.4028235e+38 f 4
float64(longdouble) 双精度浮点数 -1.7976931348623157e+308 ~1.7976931348623157e+308 f 8
complex64 单精度复数 由两个单精度浮点数(实部和虚部)组成 c 8
complex128(clongdouble) 双精度复数 由两个双精度浮点数(实部和虚部)组成 c 16

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

数组操作

数组切片

  1. 取一个值
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第5张图片

  2. 取行(或列)——以取第一列为例
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第6张图片

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

图解 Numpy,让数据科学变得简单、直观、有趣~~_第7张图片

  1. 取部分区域
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第8张图片

  2. 花式切片
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第9张图片

形状变换

  1. 平铺数组
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第10张图片
  2. 转置数组
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第11张图片

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

  1. 更改形状
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第12张图片

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

  1. 反转数组

图解 Numpy,让数据科学变得简单、直观、有趣~~_第13张图片

数组合并

图解 Numpy,让数据科学变得简单、直观、有趣~~_第14张图片

图解 Numpy,让数据科学变得简单、直观、有趣~~_第15张图片

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

数组扩展

图解 Numpy,让数据科学变得简单、直观、有趣~~_第16张图片
图解 Numpy,让数据科学变得简单、直观、有趣~~_第17张图片
图解 Numpy,让数据科学变得简单、直观、有趣~~_第18张图片

数组分割

图解 Numpy,让数据科学变得简单、直观、有趣~~_第19张图片
图解 Numpy,让数据科学变得简单、直观、有趣~~_第20张图片

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

掩膜数组

  被掩膜的值不会参与 NumPy 运算。
图解 Numpy,让数据科学变得简单、直观、有趣~~_第21张图片

其他相关方法:
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

数组排序

图解 Numpy,让数据科学变得简单、直观、有趣~~_第22张图片

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

数学运算

算数运算

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

  1. 加、减、成、除(逻辑通用)(后同)
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第23张图片

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

  1. 取余、取整
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第24张图片

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

  1. 其他运算

以乘方运算示例

图解 Numpy,让数据科学变得简单、直观、有趣~~_第25张图片

其他相关方法:
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 。

图解 Numpy,让数据科学变得简单、直观、有趣~~_第26张图片

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

图解 Numpy,让数据科学变得简单、直观、有趣~~_第27张图片

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

图解 Numpy,让数据科学变得简单、直观、有趣~~_第28张图片

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

图解 Numpy,让数据科学变得简单、直观、有趣~~_第29张图片

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

图解 Numpy,让数据科学变得简单、直观、有趣~~_第30张图片

累积运算

以累积求和为例

图解 Numpy,让数据科学变得简单、直观、有趣~~_第31张图片

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

统计计算

  1. 统计量
    图解 Numpy,让数据科学变得简单、直观、有趣~~_第32张图片

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

逻辑判断

图解 Numpy,让数据科学变得简单、直观、有趣~~_第33张图片

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

矩阵运算

以矩阵乘法为例

图解 Numpy,让数据科学变得简单、直观、有趣~~_第34张图片

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

分段函数

图解 Numpy,让数据科学变得简单、直观、有趣~~_第35张图片

其他方法:
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()

  其数据部分的组织形式可以为:
图解 Numpy,让数据科学变得简单、直观、有趣~~_第36张图片

多波段文件

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

import gma
DataSet = gma.Open('XXX.tif')
Rows = DataSet.Rows
Columns = DataSet.Columns
Bands = DataSet.Bands
Data = DataSet.ToArray()

   其数据部分的组织形式可以为:
图解 Numpy,让数据科学变得简单、直观、有趣~~_第37张图片

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

   假设有一个含有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)类似,不做说明

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

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

图解 Numpy,让数据科学变得简单、直观、有趣~~_第38张图片

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

你可能感兴趣的:(Python,基础,地理数据与处理,numpy,python)