NumPy
基础
概念
全称是“ Numeric Python”,是 Python 的第三方扩展包,主要用来计算、处理一维或多维数组
数组算术计算, NumPy 提供了大量的数学函数
底层主要用 C语言编写,能够高速地执行数值计算
NumPy 还提供了多种数据结构,能应用在数组和矩阵的运算上
优点
便捷高效地处理大量数据
-
-
-
-
- NumPy 是 Python 科学计算基础库
- NumPy 可以对数组进行高效的数学运算
- NumPy 的 ndarray 对象可以用来构建多维数组
- NumPy 能够执行傅立叶变换与重塑多维数组形状
- NumPy 提供了线性代数,以及随机数生成的内置函数
-
-
-
与python列表区别
NumPy 数组是同质数据类型(homogeneous),即数组中的所有元素必须是相同的数据类型。数据类型在创建数组时指定,并且数组中的所有元素都必须是该类型。
-
-
-
-
-
NumPy 数组提供了丰富的数学函数和操作,如矩阵运算、线性代数、傅里叶变换等。
-
-
-
-
Python 列表是异质数据类型(heterogeneous),即列表中的元素可以是不同的数据类型。列表可以包含整数、浮点数、字符串、对象等各种类型的数据
-
-
-
-
-
Python 列表提供了基本的列表操作,如添加、删除、切片、排序等。
-
-
-
-
安装
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/
ndarray
NumPy 定义了一个 n 维数组对象,简称 ndarray 对象
一个一系列相同类型元素组成的数组集合
数组中的每个元素都占有大小相同的内存块,可以使用索引或切片的方式获取数组中的每个元素。
ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存块上,并且按照一定的布局对内存块进行排列,常用的布局方式有两种,即按行或者按列。行:c语言,列:Forth语言
主要特点
多维数组:ndarray 可以表示任意维度的数组,包括一维、二维、三维等。
同质数据类型:ndarray 中的所有元素必须是相同的数据类型。
高效内存布局:ndarray 在内存中是连续存储的,这使得数组的访问和操作非常高效。
丰富的功能和方法:ndarray 提供了丰富的数学函数和操作,如矩阵运算、线性代数、傅里叶变换等。
使用方式
- ndarray 是通过 array 函数或其他 NumPy 函数(如 zeros、ones、arange 等)创建的。
- array 函数接受一个序列作为输入,并返回一个 ndarray 对象。
array创建对象
通过 NumPy 的内置函数 array() 可以创建 ndarray 对象,其语法格式如
-
-
-
-
- numpy.array(object, dtype = None, copy = True, order = None,ndmin = 0)
-
-
-
ndim指定/查看数组维度
数组的维度就是一个数组中的某个元素,当用数组下标表示的时候,需要用几个数字来表示才能唯一确定这个元素,这个数组就是几维
-
-
-
-
- 创建:numpy.array(object, ndmin = 0) 查看:numpy.ndim
-
-
-
reshape数组变维
reshape() 函数允许你在不改变数组数据的情况下,改变数组的维度。
reshape() 返回的是一个新的数组,原数组不会被修改。reshape() 可以用于多维数组,例如将一个一维数组重塑为二维数组。
元素总数必须匹配:新形状中的元素总数必须与原数组中的元素总数相同。
-1 作为占位符:你可以使用 -1 作为占位符,让 numpy 自动计算某个维度的大小。
reshape() 还可以将一维数组重塑为三维数组
数据类型
NumPy 提供了比 Python 更加丰富的数据类型
数据类型对象
-
-
-
-
- 数据类型对象(Data Type Object)又称 dtype 对象,是用来描述与数组对应的内存区域如何使用。
- 1.可以在创建数组时指定 dtype 参数来定义数组中元素的数据类型
- 2.可以使用数组的 dtype 属性来获取数组中元素的数据类型
- 3.可以使用 astype() 方法来转换数组中元素的数据类型。
-
-
-
数据类型标识码
-
-
-
-
- NumPy 中每种数据类型都有一个唯一标识的字符码,int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
-
-
-
-
-
-
-
- NumPy 中常见的数据类型标识码及其对应的详细列表(int x i x/8)
-
-
-
在编程中,字节序标记用于指定数据的字节顺序。常见的字节序标记包括:
<: 小端序,数据的最低有效字节存储在内存的最低地址,而最高有效字节存储在内存的最高地址。
>: 大端序,数据的最高有效字节存储在内存的最低地址,而最低有效字节存储在内存的最高地址。
数组属性
shape
返回一个元组,元组中的每个元素表示数组在对应维度上的大小。元组的长度等于数组的维度数。
shape 属性功能:
-
-
-
-
- 1. 未传入参数,返回一个由数组维度构成的元组
- 2. 传入参数,可以用来调整数组维度的大小
-
-
-
如果使用shape属性修改数组的形状,则修改的是原数组的形状,reshape修改数组的形状会返回一个新数组,不修改原数组的形状。
-
-
-
-
- shape,查看数组 arr.shape,直接在元素组上修改形状,不返回新数组
-
-
-
ndim
返回的是数组的维数
-
-
-
-
- 创建:numpy.array(object, ndmin = 0) 查看:numpy.ndim
-
-
-
itemsize
itemsize 属性功能:
-
-
-
-
- 返回数组中每个元素的大小(以字节为单位)
-
-
-
flags
flags 属性功能:
-
-
-
-
- 返回 ndarray 数组的内存信息
-
-
-
创建数组的其他方法
以下几个函数通常用于创建数字类型的数组,也可以用于创建布尔、字符串等类型的数组。但更适合用于创建数字数组。
empty()
empty() 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组(数组元素为随机值)
格式:
-
-
-
-
- numpy.empty(shape, dtype = float, order = 'C')
-
-
-
zeros()
创建指定大小的数组,数组元素以 0 来填充
格式:
-
-
-
-
- numpy.zeros(shape, dtype = float, order = 'C')
-
-
-
ones()
创建指定形状的数组,数组元素以 1 来填充
格式:
-
-
-
-
- numpy.ones(shape, dtype = None, order = 'C')
-
-
-
arange()
arange() 函数用于创建一个等差数列的数组。它类似于 Python 内置的 range() 函数,但返回的是一个 NumPy 数组而不是一个列表。
格式:
-
-
-
-
- numpy.arange(start, stop, step, dtype) 根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。
-
-
-
注意:
-
-
-
-
- - arange() 函数生成的数组不包含 stop 值。
- - 如果 step 为负数,则 start 必须大于 stop,否则生成的数组为空。
- - arange() 函数在处理浮点数时可能会出现精度问题,因为浮点数的表示和计算存在精度误差。
-
-
-
linspace
在指定的数值区间内,返回均匀间隔的一维等差数组,默认均分 50 份
格式:
-
-
-
-
- np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
-
-
-
切片
ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样;
slice()
在 Python 中,slice 可以作为一个对象来使用。你可以创建一个 slice 对象,然后使用它来获取序列的片段。
参数:
-
-
-
-
- - start 是切片开始的位置(包含该位置)。
- - stop 是切片结束的位置(不包含该位置)。
- - step 是切片的步长,即选取元素的间隔。
-
-
-
slice 操作也可通过 [start:stop:step] 的形式来实现
冒号 : 的作用
-
-
-
-
- - 表示范围: 冒号用于表示一个范围。例如,array[1:3] 表示从索引 1 到索引 3(不包括 3)的元素。
- - 表示所有元素: 单独使用冒号表示所有元素。例如,array[:, 1] 表示所有行的第 1 列。
- - 步长: 双冒号后面可以跟一个步长值,表示每隔多少个元素取一个。例如,array[::2] 表示每隔一个元素取一个。
- 注:冒号对于一维数组按索引号截取,二维数组按行和列截取。
-
-
-
省略号 ... 的作用
-
-
-
-
- - 表示所有维度: 省略号用于表示数组的所有维度。例如,array[..., 1] 表示取所有行的第 1 列。
- - 简化多维切片: 在多维数组中,省略号可以简化切片操作,避免显式地写出所有维度的索引。
-
-
-
高级索引
NumPy 中的高级索引指的是使用整数数组、布尔数组或者其他序列来访问数组的元素。相比于基本索引,高级索引可以访问到数组中的任意元素,并且可以用来对数组进行复杂的操作和修改。
整数数组索引
整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
布尔索引
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
-
-
-
-
- arr1=arr1[(arr1>5)]
-
-
-
逻辑运算符
- &:与运算,组合多个条件。
-
-
-
-
- arr1=arr1[(arr1>5)&(arr1<8)]
-
-
-
- |:或运算,组合多个条件。
-
-
-
-
- arr1=arr1[(arr1>5)|(arr1<8)]
-
-
-
- ~:非运算,取反条件。
广播
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。这要求维数相同,且各维度的长度相同,如果不相同,可以通过广播机制,这种机制的核心是对形状较小的数组,在横向或纵向上进行一定次数的重复,使其与形状较大的数组拥有相同的维度。
广播规则
1. 维度匹配:如果两个数组的维度数不同,维度数较少的数组会在前面补上长度为 1 的维度。
2. 长度匹配:如果两个数组在某个维度上的长度不同,但其中一个数组在该维度上的长度为 1,则该数组会沿着该维度进行广播。
3. 不匹配:如果两个数组在某个维度上的长度既不相同也不为 1,则广播失败,抛出 ValueError。
一/多维数组和标量相加:可以理解为将标量值广播扩充为和一/多维数组元素数量相同的数组,然后进行对应位置的元素相加
多维数组与一维数组相加(前提:一维数组和多维数组的行/列相同):可以理解为将一维数组行/列分别与多维数组的行/列相加,实际是将一维数组广播扩充,再与多维数组相加
二维数组与二维数组相加:形状不一样的,小的被广播到与 大的 相同的形状,然后进行逐元素相加。
迭代数组
nditer 是 NumPy 中的一个强大的迭代器对象,用于高效地遍历多维数组。nditer 提供了多种选项和控制参数,使得数组的迭代更加灵活和高效。
控制参数
nditer 提供了多种控制参数,用于控制迭代的行为。
1.order 参数
-
-
-
-
- order 参数用于指定数组的遍历顺序。默认情况下,nditer 按照 C 风格(行优先)遍历数组。
- C 风格(行优先): order='C'
- Fortran 风格(列优先): order='F'
-
-
-
2.flags 参数
-
-
-
-
- flags 参数用于指定迭代器的额外行为
- - multi_index: 返回每个元素的多维索引。
- - external_loop: 返回一维数组而不是单个元素,减少函数调用的次数,从而提高性能。
-
-
-
3.op_flags 参数
-
-
-
-
- op_flags 参数用于指定操作数的行为。
- - readonly: 只读操作数。
- - readwrite: 读写操作数。
- - writeonly: 只写操作数。
-
-
-
数组操作
数组变维
flat
-
-
-
-
- 返回一个一维迭代器,用于遍历数组中的所有元素。无论数组的维度如何,ndarray.flat属性都会将数组视为一个扁平化的一维数组,按行优先的顺序遍历所有元素。
- ndarray.flat
-
-
-
flatten()
-
-
-
-
- 用于将多维数组转换为一维数组。flatten() 返回的是原数组的一个拷贝,因此对返回的数组进行修改不会影响原数组。
- ndarray.flatten(order='C')
- order: 指定数组的展开顺序。 可以通过order设置按行或者列返回一维数组
- - `'C'`:按行优先顺序展开(默认)。
- - `'F'`:按列优先顺序展开。
- - `'A'`:如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。
- - `'K'`:按元素在内存中的顺序展开。
-
-
-
ravel()
-
-
-
-
- 用于将多维数组转换为一维数组。与 flatten() 不同,ravel() 返回的是原数组的一个视图(view),而不是拷贝。因此,对返回的数组进行修改会影响原数组。
- ndarray.ravel()
- order:指定数组的展开顺序。
- -`'C'`:按行优先顺序展开(默认)。
- -`'F'`:按列优先顺序展开。
- -`'A'`:如果原数组是Fortran连续的,则按列优先顺序展开;否则按行优先顺序展开。
- -`'K'`:按元素在内存中的顺序展开。
-
-
-
数组转置
修改数组维度
多维数组(也称为ndarray)的维度(或轴)是从外向内编号的。这意味着最外层的维度是轴0,然后是轴1,依此类推。
连接数组hstack():按行方向拼接,列数得一致(→)vstack():按列方向拼接,行数得一致(↓)
hstack函数要求堆叠的数组在垂直方向(行)上具有相同的形状。如果行数不一致,hstack()将无法执行,并会抛出ValueError异常。
hstack()要求堆叠的数组在垂直方向(行)上具有相同的形状。如果列数不一致,将无法执行堆叠操作。
vstack()和hstack()要求堆叠的数组在某些维度上具有相同的形状。如果维度不一致,将无法执行堆叠操作。
分割数组hsplit():按行方向分割(切开的是列)(→)vsplit():按列方向分割(切开的是行)(↓)
数组元素的增删改查
resize
append
insert
如果obj为-1,表示插入在倒数第一个元素之前
delete
argwhere
返回数组中非0元素的索引,若是多维数组则返回行、列索引组成的索引坐标
unique
对于多维数组,unique函数同样适用。默认情况下,unique函数会将多维数组展平为一维数组,然后查找唯一元素(去重),最后返回一个去重后的一维数组
统计函数
amin()和amax()
-计算数组沿指定轴的最小值与最大值,并以数组形式返回
-对于二维数组来说,axis=1表示沿着水平方向,axis=0表示沿着垂直方向
当`axis=0`时:沿着第一维度(即行的方向),在每一列中寻找最小值。结果将是一个包含每列最小值的一维数组。当`axis=1`时:沿着第二维度(即列的方向),在每一行中寻找最小值。结果将是一个包含每行最小值的一维数组。求最大值类似。
ptp()
-计算数组元素中最值之差值,即最大值-最小值
-对于二维数组来说,axis=1表示沿着水平方向,axis=0表示沿着垂直方向
median()
用于计算中位数,中位数是指将数组中的数据按从小到大的顺序排列后,位于中间位置的值。如果数组的长度是偶数,则中位数是中间两个数的平均值。
mean()
沿指定的轴,计算数组中元素的算术平均值(即元素之总和除以元素数量)
average()
加权平均值是将数组中各数值乘以相应的权数,然后再对权重值求总和,最后以权重的总和除以总的单位数(即因子个数);根据在数组中给出的权重,计算数组元素的加权平均值。该函数可以接受一个轴参数axis,如果未指定,则数组被展开为一维数组。
-
-
-
-
- 其中xi是数组中的元素,wi是对应的权重。
- 如果所有元素的权重之和等于1,则表示为数学中的期望值。
-
-
-
var()
在NumPy中,计算方差时使用的是统计学中的方差公式,而不是概率论中的方差公式,主要是因为NumPy的设计目标是处理实际数据集,而不是概率分布。
np.var函数默认计算的是总体方差(PopulationVariance),而不是样本方差(SampleVariance)。
对于一个总体数据集X={x1,x2,…,xN},总体方差的计算公式为:
-
-
-
-
- -N是总体数据点的总数。
- -μ是总体的均值。
-
-
-
对于一个样本数据集X={x1,x2,…,xn},样本方差的计算公式为:
-
-
-
-
- -n是样本数据点的总数。
- -xˉ是样本的均值。
- 在样本数据中,样本均值的估计会引入一定的偏差。通过使用n−1*n*−1作为分母,可以校正这种偏差,得到更准确的总体方差估计。
-
-
-
-
ddof默认为0,计算总体方差,ddof=1则计算的是样本方差。
std()
求标准差:方差开根号
标准差是方差的算术平方根,用来描述一组数据平均值的分散程度。若一组数据的标准差较大,说明大部分的数值和其平均值之间差异较大;若标准差较小,则代表这组数值比较接近平均值