「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」。
1.ndarray:多维数组对象
每一个数组都有的属性:
- shape:数组每一维度的数量;
- dtype:数组的数据类型;
- ndim:维度。
1.1 生成ndarray
数组生成函数
函数名 | 描述 |
---|---|
array | 将输入数据(可以是列表、元组、数组以及其它序列)转换为ndarray,如不显式指明数据类型,将自动推断;默认复制所有的输入数据 |
asarray | 将输入转换为ndarray,但如果输入已经是ndarray则不再复制 |
arrange | Python内建函数range的数组版,返回一个数组 |
ones | 根据给定形状和数据类型生成全1数组 |
ones_like | 根据所给的数组生成一个形状一样的全1数组 |
zeros | 根据给定形状和数据类型生成全0数组 |
zeros_like | 根据所给的数组生成一个形状一样的全0数组 |
empty | 根据给定形状生成一个没有初始化值的空数组 |
empty_like | 根据所给数组生成一个形状一样但没有初始化数值的空数组 |
full | 根据给定的形状和数据类型生成指定数值的数组 |
full_like | 根据所给的数组生成一个形状一样但内容是指定数值的数组 |
eye,identity | 生成一个NXN特征矩阵(对角线位置都是1,其余位置是0) |
1.2 ndarray的数据类型
Numpy数据类型
类型 | 类型代码 | 描述 |
---|---|---|
int8, uint8 | i1, u1 | 有符号和无符号的8位整数 |
int16, uint16 | i2, u2 | 有符号和无符号的16位整数 |
int32, uint32 | i4, u4 | 有符号和无符号的32位整数 |
int64, uint64 | i8, u8 | 有符号和无符号的64位整数 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准单精度浮点数;兼容C语言float |
float64 | f8或d | 标准双精度浮点数;兼容C语言double和Python float |
float28 | f16或g | 拓展精度浮点数 |
complex64, complex128, complex256 | c8, c16, c32 | 分别基于32位、64位、128位浮点数的复数 |
bool | ? | 布尔值,存储True或False |
object | O | Python object类型 |
String_ | S | 修正的ASCII字符串类型;例如生成一个长度为10的字符串类型,使用'S10' |
unicode_ | U | 修正的Unicode类型,生成一个长度为10的Unicode类型,使用'U10' |
- 可以使用astype显式地转换数组的数据类型;
- 使用astype时总是生成一个新的数组,即使你传入的dtype与之前一样。
1.3 基础索引与切片
- 区别于Python的内建列表,数组的切片是原数组的视图。这意味着数据并不是被复制了,任何对于视图的修改都会反映到原数组上;
- 不写切片值的[ : ]将会引用数组的所有值;
- 如果想要一份数组的拷贝而不是一份视图的话,需要显式地复制这个数组,例如arr[5:8].copy();
- 切片时,单独一个冒号表示选择整个轴上的数组,例如,对一个2维数组arr,arr[:, :1],代表所有行的第1列。
1.4 布尔索引
- 布尔值数组的长度必须和数组轴索引长度一致;
- 当布尔值数组的长度不正确时,布尔值选择数据的方法并不会报错;
- 使用布尔值索引选择数据时,总是生成数据的拷贝,及时返回的数组并没有任何变化。
1.5 数组转置和换轴
转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容。
- 矩阵转置:T;
- 矩阵内积:np.dot;
- 对于高维度数组,transpose方法可以接收包含轴编号的元组,用于置换轴;
- 使用.T进行转置是换轴的一个特殊案例。ndarray有一个swapaxes方法,该方法接收一对轴编号作为参数,并对轴进行调整用于重组数据。
2.通用函数:快速的逐元素数组函数
通用函数,也可以成为ufunc,是一种在ndarray数据中进行逐元素操作的函数。
2.1 一元通用函数
函数名 | 描述 |
---|---|
abs、fabs | 逐元素地计算整数、浮点数或复数的绝对值 |
sqrt | 计算每个元素的平方根(与 arr ** 0.5 相等) |
square | 计算每个元素的平方(与 arr ** 2 相等) |
exp | 计算每个元素的自然指数值 |
log、log10、log2、log1p | 分别对应:自然对数(e为底)、对数10为底、对数2为底、log(1+x) |
sign | 计算每个元素的符号值:1(整数)、0(0)、-1(负数) |
ceil | 计算每个元素的最高整数值(即大于等于给定数值的最小整数) |
floor | 计算每个元素的最小整数值(即小于等于给定数值的最大整数) |
rint | 将元素保留到整数位,并保持dtype |
modf | 分别将数组的小数部分和整数部分按数组形式返回 |
isnan | 返回数组中的元素是否是一个NaN(不是一个数值),形式为布尔值数组 |
isfinite、isinf | 分别返回数组中的元素是否有限(非inf、非NaN)、是否无限的,形式为布尔值数组 |
cos、cosh、sin、sinh、tan、tanh | 常规的双曲三角函数 |
arccos、arccosh、arcsin、arcsinh、arctan、arctanh | 反三角函数 |
logical_not | 对数据的元素按位取反(与 ~arr 效果一致) |
2.2 二元通用函数
函数名 | 描述 |
---|---|
add | 将数组的对应元素相加 |
subtract | 在第二个数组中,将第一个数组中包含的元素去除 |
multiply | 将数组的对应元素相乘 |
divide、floor_divide | 除或整除 |
power | 将第二个数组的元素作为第一个数组对应元素的幂次方 |
maximum、fmax | 逐个元素计算最大值,fmax忽略NaN |
minimum、fmin | 逐个元素计算最小值,fmin忽略NaN |
mod | 按元素的求模计算(即求除法的余数) |
copysign | 将第一个数组的符号值改为第二个数组的符号值 |
greater、greater_equal、less、less_equal、equal、not_equal | 进行逐个元素的比较,返回布尔值数组 |
logical_and、logical_or、logical_xor | 进行逐个元素的逻辑操作(与或非) |
3.使用数组进行面向数组编程
使用NumPy数组可以利用简单的数组表达式完成多种数据操作任务,而无须写大量循环。这种利用数组表达式来替代显式循环的方法,成为向量化。
- np.meshgrid函数接收两个一维数组,并根据两个数组的所有(x, y)对生成一个二维矩阵。
3.1 将条件逻辑作为数组操作
numpy.where函数是三元表达式 x if condition else y 的向量化版本。
- np.where的第二个和第三个参数并不需要是数组(同等大小的数组),它们可以是标量;
- where在数据分析的一个典型用法是根据一个数组来生成一个新的数组。
3.2 数学和统计方法
许多关于计算整个数组统计值或关于轴向数据的数学函数,可以作为数组类型的方法被调用。可以使用聚合函数(通常也叫缩减函数),比如sum、mean和std(标准差),既可以直接调用数组实例的方法,也可以使用顶层的Numpy函数。
基础数组统计方法
方法 | 描述 |
---|---|
sum | 沿着轴向计算所有元素的累和,0长度的数组,累和为0 |
mean | 数学平均,0长度的数组平均值为NaN |
std、var | 标准差和方差,可以选择自由度调整(默认分母是n) |
min、max | 最小值和最大值 |
argmin、argmax | 最小值和最大值的位置 |
cumsum | 从0开始元素累积和 |
cumprod | 从1开始元素累积和 |
3.3 布尔值数组的方法
- sum:计算布尔值数组中True的个数;
- all:检查是否每个值都是True;
- any:检查是否至少有一个是True。
3.4 唯一值与其他集合逻辑
Numpy包含一些针对一维ndarray的基础集合操作。常用的一个方法是np.unique,返回的是数组中唯一值排序后形成的数组。
数组的集合操作
方法 | 描述 |
---|---|
unique(x) | 计算x的唯一值,并排序 |
intersect1d(x, y) | 计算x和y的交集,并排序 |
union1d(x, y) | 计算x和y的并集,并排序 |
in1d(x, y) | 计算x中的元素是否包含在y中,返回一个布尔值数组 |
setdiff1d(x, y) | 差集,在x中但不再y中的x的元素 |
setxor1d(x, y) | 异或集,在x或y中,但不属于x、y交集的元素 |
4.使用数组进行文件输入和输出
Numpy可以在硬盘中将数据以文本或二进制文件的形式进行存入硬盘或由硬盘载入。
- np.save和np.load是搞笑读取硬盘数据的两大工具函数。数组在默认情况下是以未压缩的格式进行存储的,后缀名是.npy;
- 可以使用np.savez并将数组作为参数传递给该函数,用于在未压缩文件中保存多个数组;
- 如果数据已经压缩好了,需要使用:numpy.savez_compressed将数据存入已经压缩的文件。
5.线性代数
- np.dot:矩阵乘积,x.dot(y)等价于np.dot(x, y);
- 特殊符号@也作为中缀操作符,用于点乘矩阵操作:x @ np.ones(3);
- numpy.linalg拥有一个矩阵分解的标准函数集,以及其他常用函数,例如求逆和行列式求解。
常用 numpy.linalg 函数
函数 | 描述 |
---|---|
diag | 将一个方阵的对角(或非对角)元素作为一维数组返回,或者将一维数组转换成一个方阵,并且在非对角线上有零点 |
dot | 矩阵点乘 |
trace | 计算对角元素和 |
det | 计算矩阵的行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆矩阵 |
pinv | 计算矩阵的 Moore-Penrose 伪逆 |
qr | 计算QR分解 |
svd | 计算奇异值分解(SVD) |
solve | 求解x的线性系统 Ax = b。其中A是方阵 |
lstsq | 计算 Ax = b 的最小二乘解 |
6.伪随机数生成
numpy.random中的部分函数列表
函数 | 描述 |
---|---|
seed | 向随机数生成器传递随机状态种子 |
permutation | 返回一个序列的随机排列,或者返回一个乱序的整数范围序列 |
shuffle | 随机排列一个序列 |
rand | 从均匀分布中抽取样本 |
randint | 根据给定的由低到高的范围抽取随机整数 |
randn | 从均值0方差1的正态分布中抽取样本(MATLAB型接口) |
binomial | 从二项分布中抽取样本 |
normal | 从正态(高斯)分布中抽取样本 |
beta | 从beta分布中抽取样本 |
chisquare | 从卡方分布中抽取样本 |
gamma | 从伽马分布中抽取样本 |
uniform | 从均匀[0, 1)分布中抽取样本 |