前言
背景
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
秩
秩(rank)就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。
广播机制
广播(Broadcasting)描述了numpy如何在算术运算期间处理具有不同形状的数组。受某些约束的影响,较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。。它可以在不制作不必要的数据副本的情况下实现这一点,通常导致高效的算法实现。然而,有些情况下广播会导致内存使用效率低下,从而减慢计算速度。
数组操作
Ndarray概述
- N维数组对象ndarray是用于存放同类型元素的多维数组。
- ndarray中的每个元素在内存中都有相同存储大小的区域。
- ndarray中的每个元素是数据类型对象的对象(称为 dtype)
- 与 Python中的其他容器对象一样,可以通过对数组进行索引或切片。
- 可通过ndarray的方法和属性来访问和修改ndarray的内容。
数组创建
- 常用函数
方法 | 解释 | 重要参数 |
---|---|---|
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=维度列表 |
- 常用属性
属性 | 解释 |
---|---|
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() |
所有元素累积 |
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) |
常用操作
方法 | 解释 |
---|---|
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() |
求矩阵线性方程的解 |
索引
切片索引和花式索引
切片索引使用格式为data[row_index,col_index]
(花式索引是NumPy用来描述使用整型数组作为索引的术语):
|
|
布尔索引
布尔数组的形状必须与要索引的数组的初始尺寸相同,索引结果是一个一维数组,其中包含索引数组中与布尔数组中所有真实元素对应的所有元素,并以行顺序返回。布尔索引使用格式为data[bool_index]
2:
|
|
条件索引
条件索引主要使用where函数,原型为np.where(condition, x, y)
,相当于三元运算符x if condition else y
:
|
|
参考
-
姆咪的二哥. NumPy中的维度(dimension)、轴(axis)、秩(rank)的含义. 知乎. [2018-11-30] ↩︎
-
Retrospector. Python中numpy获取满足条件的索引值(np.where 和 np.argwhere). CSDN. [2020-03-12] ↩︎