主要内容
- ndarray:一种高效多维数组,具有基于数组的便捷算术操作以及灵活的广播功能;
- 对所有数据进行快速的矩阵运算,无序编写循环程序;
- 对硬盘中的数组数据进行读写的工具,并对内存映射文件进行操作;
- 线性代数、随机数生成以及傅里叶变换功能;
- 用于连接 NumPy 到 C、C++ 和 FORTRAN 语言类库的 C 语言 API;
1. NumPy ndarray:多维数组对象
一个快速、灵活的大型同类数据集容器,允许使用类似于标量的操作语法在整块数据上进行计算
ndarray.shape: 维度大小属性
ndarray.dtype: 数据类型属性
1.1 生成 ndarray
- array 函数接收任意的序列型对象,生成一个新的包含传递数据的 NumPy 数组;
- 嵌套序列将会自动传换成多维数组;
数组生成函数:
函数名 | 描述 |
---|
array | 将输入数据转换为ndarray,如不显式地指明数据类型,将自动推断;默认复制所有的输入数据 |
asarray | 将输入转换为 ndarray,但如果输入已经是 ndarray 则不再复制 |
arange | Python 内建函数 range 的数组版,返回一个数组 |
ones | 根据给定形状和数据类型生成全 1 数组 |
ones_like | 根据所给的数组生成一个形状一样的全 1 数组 |
zeros/zeros_like | 全 0 数组,和全 1 类似 |
empty/empty_like | 全空数组,同上 |
full/full_like | 指定数值数组,同上 |
eye, identity | N*N 特征矩阵(对角线全是1,其余都是 0) |
1.2 ndarray 的数据类型
- 使用 array 函数时给可选参数 dtype 赋值(类型名 or 类型代码)
- 使用 astype 方法显式地转换数组的数据类型(总是生成一个新的数组)
NumPy 数据类型:
类型 | 类型代码 | 描述 |
---|
int8, uint8 | i1, u1 | 有符号和无符号的 8 数位(1字节)整数,16位(2字节),32位(4字节),64位(8字节)同理 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准单精度浮点数,兼容 C 语言 float |
float64 | f8或d | 标准双精度浮点数,兼容 C 语言 double 和 Python float |
float128 | f16或g | 拓展精度浮点数 |
complex64, complex128, complex256 | c8, c16, c32 | 分别基于 32 位、64 位、 128 位浮点数的复数 |
bool | ? | 布尔值 |
object | O | Python object 类型 |
string_ | S | 修正的ASCII字符串类型;例如生成一个长度位10的字符串类型,使用‘S10’ |
unicode_ | U | 修正的 Unicode 类型,生成一个长度为 10 的 Unicode 类型,使用‘U10’ |
1.3 Numpy 数组算术
- 数组之所以重要是因为它允许你进行批量性操作而无需任何 for 循环(向量化)
- 任何两个等尺寸数组之间的算术操作都应用了逐元素操作的方式
- 带有标量计算的算术操作,会把计算参数传递给数组的每一个元素;
- 同尺寸数组之间的比较,会产生一个布尔值数组;
- 不同尺寸的数组间的操作,将会用到广播特性;
1.4 基础索引与切片
- 一维数组的切片和列表类似;
- 与列表不同的是,数组的切片都是原数组的视图,数据并不是被复制了,任何对于视图的修改都会反映到原数组上(数组的量太大,不适合复制数据,若要复制,使用 .copy() 方法)
- 二维数组的索引,将0轴看作行,1轴看作列;
- 多维数组中,省略后续索引值,返回的对象将是降低一个维度的数组;
- 切片与列表相似;
1.5 布尔索引
- 布尔数组的长度必须和数组轴索引长度一致;
- 使用或 != 或在表达式前使用 ~ 对条件取反;
1.6 神奇索引
- 简单地通过传递一个包含指明所需顺序的列表或数组选出一个符合特定顺序的数组的子集;
- 使用负的索引,将从尾部进行选择;
- 神奇索引与切片不同,它总是将数据复制到一个新的数组中;
1.7 数组转置和换轴
- arr.T 与 arr.transpose(包含轴编号的元组):置换轴的顺序,arr.T 为二维数组的转置;
- arr.swapaxes(一对轴编号的元组):交换元组内的两个轴,返回的是数据的视图;
2. 通用函数:快速的逐元素数组函数
2.1 一元通用函数:
函数名 | 描述 |
---|
abs, fabs | 逐元素地计算整数、浮点数或复数的绝对值 |
sqrt | 计算每个元素的平方根(与 arr ** 0.5 相等) |
square | 计算每个元素的平方(与 arr ** 2 相等) |
exp | 计算每个元素的自然指数值ex |
log, log10, log2, log1p | 自然对数、对数10为底,对数2为底,log(1+x) |
sign | 每个元素的符号值:1(正数),0,-1(负数) |
ceil | 计算每个元素的最高整数值(即大于等于给定元素的最小整数,即向上取整) |
floor | 计算每个元素的最小整数值(即小于等于给定元素的最大整数,即向下取整) |
rint | 将元素保留到整数位,并保持 dtype |
modf | 分别将数组的小数部分和整数部分按数组形式返回 |
isnan | 返回数组中的元素是否是一个 NaN,为布尔值数组 |
isfinite, isinf | 元素是否有限、是否无限,为布尔值数组 |
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. 使用数据进行面向数组编程
- np.meshgrid 函数接收两个一维数组,生成由这两个一维数组的(x, y)对组成的网格数据的坐标矩阵(两个二维矩阵,一个 X,一个 Y,X 的每行都一样,Y 的每列都一样)
3.1 将条件逻辑作为数组操作
- np.where 是 x if condition else y 的向量化版本:
np.where(cond, xarr, yarr):当 cond 中的元素为 True 时,取 xarr 中对应的元素值,当 cond 为 False 时,取 yarr 中的对应值(xarr 和 yarr 也可以是标量)
3.2 数学和统计方法
基础数组统计方法:
方法 | 描述 |
---|
sum | 沿着轴向计算所有元素的累和,0 长度的数组,累和为0 |
mean | 数学平均,0 长度的数组平均值为 NaN |
std, var | 标准差和方差,可以选择自由度调整(默认分母是 n) |
min, max | 最小值和最大值 |
argmin, argmax | 最小值和最大值的位置 |
cumsum | 从 0 开始元素累积和 |
cumprod | 从 1 开始元素累积和 |
3.3 布尔值数组方法
- sum 方法可以用于计算布尔值数组中的 True 的个数;
- any 方法检查数组中是否至少有一个 True;
- all 方法检查是否每个值都是 True;
3.4 排序
- 与 Python 内建列表相似,NumPy 数组可以使用 sort 方法按位置排序;
- 在多维数组中根据传递的 axis 值,沿着轴向对每个一维数组段进行排序;
- 数组的 sort 方法会改变原数组,而顶层的np.sort(arr)方法返回的是已经排序好的数组拷贝,不会改变原数组;
3.5 唯一值与其他集合逻辑
数组的集合操作
方法 | 描述 |
---|
unique(x) | 计算 x 的唯一值,并排序 |
intersect1d(x, y) | 计算 x 和 y 的交集,并排序 |
uion1d(x, y) | 计算 x 和 y 的并集,并排序 |
in1d(x, y) | 计算 x 中的元素是否包含在 y 中,返回一个布尔值数组 |
setdiff1d(x, y) | 差集,在 x 中但不在 y 中的 x 的元素 |
setxor1d(x, y) | 异或集,在 x 或 y 中,但不属于 x,y 交集的元素 |
4. 使用数组进行文件输入和输出
- np.save(‘name’, arr),默认存储为 .npy 格式;
- np.load(‘name.npy’);
- 保存多个数组:np.savez(‘name.npz’, a=arr, b=arr)
- 载入 .npz 文件时,得到一个字典型对象;
- 将数据存入已压缩的文件:np.savez_compressed(‘name.npz’, a=arr, b=arr)
5. 线性代数
- 矩阵的点乘:x.dot(y) 等价于 np.dot(x, y);
- numpy.linalg 函数:
函数 | 描述 |
---|
diag | 将一个方阵的对角(或非对角)元素作为一维数组返回,或者将一维数组转换成一个方阵,并且在非对角线上有零点 |
dot | 矩阵点乘 |
trace | 计算对角元素和 |
det | 计算矩阵的行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆矩阵 |
pinv | 计算矩阵的 Morre-Penrose 伪逆 |
qr | 计算 QR 分解 |
svd | 计算奇异值分解(SVD) |
solve | 求解 x 的线性系统 Ax=b,其中 A是方阵 |
lstsq | 计算 Ax=b 的最小二乘解 |
6. 伪随机数生成
- 计算机生成的随机数是由具有确定性行为的算法根据随机数生成器中的随机数种子生成的;
- 可以通过 np.random.seed 更改 NumPy 的随机数种子;
- numpy.random 中的数据生成函数公用了一个全局的随机数种子;
- 使用 numpy.random.RandomState 生成一个随机数生成器,其数据独立于其他的随机数状态;
- numpy.random 中的部分函数列表:
函数 | 描述 |
---|
seed | 向随机数生成器传递随机状态种子 |
permutation | 返回一个序列的随机排列,或者返回一个乱序的整数范围序列 |
shuffle | 随机排列一个序列 |
rand | 从均匀分布中抽取样本 |
randint | 根据给定的由低到高的范围抽取随机整数 |
randn | 由均值 0 方差 1 的正太分布中抽取样本(MATLAB 型接口) |
binomial | 从二项分布中抽取样本 |
normal | 从正太(高斯)分布中抽取样本 |
beta | 从 beta 分布中抽取样本 |
chisquare | 从卡方分布中抽取样本 |
gamma | 从伽马分布中抽取样本 |
uniform | 从均匀[0, 1) 分布中抽取样本 |