numpy理解及常用函数介绍

前言

背景

Python中用列表(list)保存一组值,可用来当作数组使用,由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。为保存一个简单的[1,2,3],需要有3个指针和三个整数对象,对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。此外Python还提供了一个array模块,array对象和列表不同,它直接保存数值,和C语言的一维数组比较类似,但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。numpy的诞生弥补了这些不足, numpy提供ndarray( N-dimensional array object)对象: ndarray是存储单一数据类型的多维数组。

介绍

numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,支持维度数组与矩阵运算,广泛应用于处理机器学习数据、图像处理和计算机图形学、数学计算等场景。其内容主要包括:

  • N维数组对象ndarray,具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
  • 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
  • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
  • 线性代数、随机数生成以及傅里叶变换等功能。
  • 用于集成由C、C++、 Fortran等语言编写的代码的工具。

基本概念

在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions),每个轴方向的元素个数称为该轴的长度。一维数组只有一个轴(axis=0),二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以可以理解为一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。1

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20200821162209.png

秩(rank)就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。

广播机制

广播(Broadcasting)描述了numpy如何在算术运算期间处理具有不同形状的数组。受某些约束的影响,较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。。它可以在不制作不必要的数据副本的情况下实现这一点,通常导致高效的算法实现。然而,有些情况下广播会导致内存使用效率低下,从而减慢计算速度。

数组操作

Ndarray概述

  • N维数组对象ndarray是用于存放同类型元素的多维数组。
  • ndarray中的每个元素在内存中都有相同存储大小的区域。
  • ndarray中的每个元素是数据类型对象的对象(称为 dtype)
  • 与 Python中的其他容器对象一样,可以通过对数组进行索引或切片。
  • 可通过ndarray的方法和属性来访问和修改ndarray的内容。

数组创建

  1. 常用函数
方法 解释 重要参数
numpy.array(object, dtype None, copy= True, order None, subok=False, ndmin =0) 将序列型的对象转成一个含有传入数据的numpy数组,嵌套序列将会被转换为一个多维数组 object=数组或嵌套的数列、order=创建数组的样式,C为行优先,F为列优先,A为任意方向(默认)、ndmin=指定生成数组的最小维度
numpy.zeros(shape, dtype=float, order='C') 生成特定的零数组 shape=维度列表
numpy.ones(shape, dtype=None, order='C') 生成特定的全1数组 同上
numpy.identity(n, dtype=None) 生成单位数组 n=单位数组维度
numpy.random.rand(d0, d1, ..., dn) 创建给定形状的数组,值在[0,1)上分布 dn=维度列表
numpy.random.uniform(low=0.0, high=1.0, size=None) 生成一个值在[low, high)范围的给定形状的数组 size=维度列表
numpy.random.randint(low, high=None, size=None, dtype=int) 生成一个值在[low, high)范围的给定形状的整数数组 同上
numpy.random.normal(loc=0.0, scale=1.0, size=None) 给定均值、标准差、维度的正态分布 loc=均值, scale=标准差, size=维度列表
  1. 常用属性
属性 解释
ndarray.size 数组元素个数
ndarray.shape 数组形状
ndarray.ndim 数组维度
ndarray.dtype 数组元素类型
ndarray.Itemsize 数组元素字节大小

数组运算

运算符 示例 说明
+ arr1+arr2 基础加法
- arr1-arr2 基础减法
* arr1*arr2 基础乘法(按元素)
/ 1/array 基础除法
** arr1**2 幂运算
dot() arr1.dot(arr2) 矩阵乘法([n×m]×[m×n]=[n×n])
+=-=/=*= arr1 += 2 更改原数组

数组统计

方法 解释
numpy.sum() 对数组中全部或某维度的元素求和
numpy.mean() 算术平均数(零长数组为NaN)
numpy.std()numpy.var() 标准差和方差(可调自由度)
numpy.max()numpy.min() 最大值和最小值
numpy.argmax()numpy.argmin() 最大值和最小值的索引
numpy.comsum() 所有元素累加
numpy.comprod() 所有元素累积
技巧
所有统计操作都有对应的ndarray实现。例:numpy.sum(ndarray) = ndarray.sum()

矩阵操作

Matrix概述

  • NumPy中包含了一个矩阵库numpy.matlib,该模块中的函数返回的是一个矩阵,而不是ndarray对象。
  • 一个mxn的矩阵是一个由m行(row)n列(column)元素排列成的矩形阵列。
  • 矩阵里的元素可以是数字、符号或数学式
  • NumPy和 Matlab不一样,对于多维数组的运算缺省情况下并不使用矩阵运算,可以调用ndarray对象相应的函数进行矩阵运算
    警告
    官方 建议弃用matrix,使用ndarray代替。
    It is no longer recommended to use this class, even for linear algebra. Instead use regular arrays. The class may be removed in the future.

矩阵创建

方法 解释
numpy.matrix() 将序列型的对象转成一个矩阵
numpy.matlab.empty() 生成指定维度矩阵并填充随机数据
numpy.matlab.zeros() 生成指定维度的全0矩阵
numpy.matlab.ones() 生成指定维度的全1矩阵
numpy.matlab.eye() 生成对角线为1、其它为0的指定维度矩阵
numpy.matlab.identity() 生成指定维度的单位矩阵
numpy.matlab.rand() 生成指定维度矩阵并填充随机数据 [0,1)
技巧
对于矩阵m来说,x[0,0]表示第一行第一列元素,x[0][0]表示第一维数据。

常用操作

方法 解释
numpy.asarray() 矩阵转数组
numpy.asmatrix() 数组转矩阵
matrix.T 矩阵转置
matrix.mean() 计算矩阵特征值
matrix.sum() 计算矩阵指定元素和
matrix.max()matrix.min() 计算指定维度最大值、最小值
matrix.argmax()matrix.argmin() 计算指定维度最大值、最小值的索引
matrix.diagonal() 对角线元素

矩阵运算

方法 解释
numpy.dot() 求点积(元素对应相乘)
numpy.vdot() 求内积(元素对应相乘的和)
numpy.trace() 求对角元素的和
numpy.linalg.inv() 求方阵的逆
numpy.linalg.det() 求行列式
numpy.linalg.eig() 求方阵的特征值和特征向量
numpy.linalg.svd() 求奇异值分解(SVD)
numpy.linalg.solve() 求矩阵线性方程的解
技巧
numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西

索引

切片索引和花式索引

切片索引使用格式为data[row_index,col_index](花式索引是NumPy用来描述使用整型数组作为索引的术语):

1
2
3
4
data = np.random.randint(1,5,size=[4,5])
data[1,2] # 第一行第二列
data[1:3,2:4]   # 第一到三行第二到四列
data[[1,3],[2,3]]   # (1,2)和(3,3)位置处的元素(花式索引)

布尔索引

布尔数组的形状必须与要索引的数组的初始尺寸相同,索引结果是一个一维数组,其中包含索引数组中与布尔数组中所有真实元素对应的所有元素,并以行顺序返回。布尔索引使用格式为data[bool_index]2

1
2
data = np.random.randint(1,5,size=[4,5])
data[data > 2] # 大于2的元素

条件索引

条件索引主要使用where函数,原型为np.where(condition, x, y),相当于三元运算符x if condition else y

1
2
3
4
5
6
7
data = np.random.randint(1,5,size=[4,5])
data2 = np.random.randint(1,5,size=[4,5])
np.where(data > 2, True, False)    # data中元素大于2的位置返回True,否则返回False
data[np.where(data > 1)]    # 选择大于1的元素
data[np.where((data > 1)&(data<4))]    # 选择大于1并且小于4的元素
data[np.where((data > 3)|(data<2))]    # 选择大于3或小于2的元素
data2[np.where(data > 1)]    # 选择data大于1位置的data2的元素

参考