欢迎光临
我们一直在努力

python14(NumPy)

NumPy 基础:Python科学计算的基石

在前文的基础上,我们今天继续简单了解一下numpy吧;NumPy(Numerical Python)是 Python 科学计算生态中的基础库,其核心数据结构为 多维数组对象(ndarray)。与 Python 原生嵌套列表相比,ndarray 在存储和计算效率上具有显著优势,主要体现在三个方面:

  • 同质数据类型:所有元素类型一致,内存布局连续,访问速度快;
  • 固定大小:改变数组大小将创建新对象,不支持动态扩容(如 append);
  • 向量化操作:支持对整个数组执行批量算术运算,无需显式循环,兼具代码简洁性与执行性能。

一、安装与环境配置

  • 若使用 Anaconda 发行版,NumPy 已预置,无需额外安装。
  • 标准 Python 环境可通过 pip 安装:pip install numpy # 安装最新版本
    pip install numpy==1.24.0 # 安装指定版本

  • 查看已安装版本:import numpy as np
    print(np.__version__) # 注意双下划线


二、数组创建方法

1. 从已有数据转换
函数说明
np.array(object, dtype=None) 从类数组对象(列表、元组等)创建 ndarray,默认推断数据类型
np.asarray(a, dtype=None) 与 array 类似,但若 a 已是 ndarray 且 dtype 匹配,则返回原对象(不复制)
np.copy(a) / ndarray.copy() 强制生成副本
np.fromiter(iterable, dtype, count=-1) 从可迭代对象生成一维数组

示例:

import numpy as np

arr1 = np.array([1, 2, 3]) # 一维
arr2 = np.array([[1, 2], [3, 4]]) # 二维
arr3 = np.array([[[1,2],[3,4]], [[5,6],[7,8]]]) # 三维
arr0 = np.array(13) # 零维标量数组

# 自动类型提升
arr_big = np.array([[1, 2], [3, 2147483648]])
print(arr_big.dtype) # int64

常用 dtype:

类型描述
np.int32 有符号32位整数
np.int64 有符号64位整数
np.uint8 无符号8位整数(0~255)
np.float32 单精度浮点数
np.float64 双精度浮点数(默认)

ndarray 核心属性:

arr.ndim # 轴的数量(秩)
arr.shape # 各维长度,如 (2, 3)
arr.size # 元素总数
arr.dtype # 元素数据类型
arr.itemsize # 每个元素所占字节数

注意:np.asarray 与 np.array 的关键区别在于,当输入已是 ndarray 时,asarray 返回原对象引用(无拷贝),array 则生成新副本。在内存敏感场景下应优先使用 asarray。


2. 按形状或值初始化
函数作用
np.empty(shape, dtype) 分配未初始化的数组(内容随机),速度最快
np.empty_like(a) 生成与 a 形状相同且未初始化的数组
np.zeros(shape) 全零数组
np.zeros_like(a) 形状同 a 的全零数组
np.ones(shape) 全一数组
np.ones_like(a) 形状同 a 的全一数组
np.full(shape, fill_value) 全为指定填充值的数组
np.full_like(a, fill_value) 形状同 a 且填充指定值
np.eye(N, M=None, k=0) 单位矩阵(对角线为1),可指定偏移量 k
np.identity(n) 方阵单位矩阵

示例:

np.zeros((2, 3), dtype=np.int32)
np.ones_like([[1, 2], [3, 4]]) # 返回同形状的全一数组
np.full((2, 2), 7)
np.eye(3, 4, k=1) # 3行4列,上对角线为1


3. 从数值序列生成
函数说明
np.arange([start,] stop[, step], dtype) 类似 range,但支持浮点步长,返回数组
np.linspace(start, stop, num=50, endpoint=True, retstep=False) 生成等差数列(均匀间隔)
np.logspace(start, stop, num=50, endpoint=True, base=10.0) 生成等比数列(对数尺度)

示例:

np.arange(3, 7, 0.5) # array([3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5])
np.linspace(1, 10, num=10, endpoint=False) # 不包含终点
np.logspace(2.0, 3.0, num=4) # base=10,结果为 [100, 215.4, 464.1, 1000]


三、数组变形、转置与拼接

1. 改变形状
函数说明
np.reshape(a, newshape) 返回指定形状的视图(不复制数据),总元素数必须不变
ndarray.resize(new_shape) 原地修改形状,允许总大小改变(多余填充或截断)
ndarray.flatten() 返回一维副本

a = np.array([1, 2, 3, 4, 5, 6])
a.reshape((2, 3)) # 返回新形状的视图
a.resize((2, 3)) # 直接修改 a


2. 转置与轴重排
函数说明
ndarray.T 转置(适用于二维矩阵)
np.transpose(a, axes=None) 按指定轴顺序排列,默认反转所有轴
np.swapaxes(a, axis1, axis2) 交换两个轴
np.expand_dims(a, axis) 在指定位置插入长度为1的新轴
np.squeeze(a, axis=None) 移除所有长度为1的轴(或指定轴)

x = np.arange(6).reshape((1, 2, 3))
np.swapaxes(x, 0, 2) # 交换第0轴和第2轴
np.expand_dims(np.array([1, 2]), axis=0) # 形状变为 (1, 2)
np.squeeze(np.array([[[0], [1]]])) # 移除所有单维轴


3. 拼接与堆叠
函数说明
np.concatenate((a1, a2, …), axis=0) 沿现有轴拼接(axis=None 则先扁平化)
np.stack(arrays, axis=0) 沿新轴堆叠(增加维度)
np.hstack(tup) 水平(列方向)堆叠
np.vstack(tup) 垂直(行方向)堆叠

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0) # 垂直拼接
np.concatenate((a, b.T), axis=1) # 水平拼接(需调整 b 的形状)
# stack 示例:5个 (3,4) 数组,沿不同轴堆叠后形状分别为 (5,3,4)、(3,5,4)、(3,4,5)


4. 元素重复与去重
函数说明
np.repeat(a, repeats, axis=None) 重复数组元素,可沿指定轴
np.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None) 排序后去重,可返回索引、逆编码或计数

x = np.array([[1, 2], [3, 4]])
np.repeat(x, 2) # 扁平化后每个元素重复2次
np.repeat(x, 3, axis=1) # 每列重复3次
np.unique([3, 3, 1, 1, 2, 2]) # 返回 [1, 2, 3]


四、算术运算与广播机制

所有算术运算(加、减、乘、除、比较等)均为逐元素操作,这是向量化编程的核心。

a = np.array([[1, 2], [3, 4], [5, 6]])
print(a + 2) # 标量加法
print(a * 2) # 标量乘法
print(a < 4) # 逐元素比较,返回布尔数组
b = np.array([[2, 2], [2, 1], [1, 1]])
print(a + b) # 对应元素相加

广播机制:当两数组形状不同时,NumPy 会尝试“拉伸”较小数组的维度,前提是从末尾维度开始比较,二者相等或其中一方为1。例如:

  • 形状 (3,2) 与 (2,) 可广播(后缘维度均为2);
  • 形状 (3,2) 与 (1,2) 可广播;
  • 形状 (3,2) 与 (3,1) 可广播;
  • 形状 (3,2) 与 (3,) 不可广播(后缘维度 2 ≠ 3)。

规则总结:从右向左比较,维度相等或为1则兼容。


五、数学与统计函数

1. 三角函数(角度以弧度为单位)
函数说明
np.sin(x)、np.cos(x)、np.tan(x) 正弦、余弦、正切
np.arcsin(x)、np.arccos(x)、np.arctan(x) 反正弦、反余弦、反正切

np.sin(np.pi / 2) # 1.0
np.cos(np.array([0, 60, 90]) * np.pi / 180) # 角度转弧度


2. 取整、指数与对数
函数说明
np.floor(x) 向下取整
np.ceil(x) 向上取整
np.exp(x) 自然指数(e^x)
np.log(x) 自然对数
np.log2(x) 以2为底的对数
np.log10(x) 以10为底的对数

np.floor([1.7, 0.2, 1.7]) # [-2., -1., 1.]
np.exp([0, 1, 2]) # [1., 2.718, 7.389]


3. 统计方法(ndarray 方法)
方法说明
ndarray.max(axis=None) / min 最大值 / 最小值
ndarray.mean(axis=None) 算术平均值
ndarray.var(axis=None) 方差
ndarray.std(axis=None) 标准差
np.sum(a, axis=None, initial=…) 求和(亦可用 ndarray.sum())
np.prod(a, axis=None) 求所有元素的乘积
  • axis=0 表示沿第0轴(行方向)操作,结果形状降一维;若设置 keepdims=True,则保留长度为1的维度。

arr = np.array([[0, 1, 7, 3], [4, 9, 6, 2], [8, 5, 11, 10]])
arr.max(axis=0) # 每列最大值: [8, 9, 11, 10]
arr.mean(axis=1) # 每行平均值


4. 比较函数(返回布尔数组)
函数运算符说明
np.greater(x1, x2) > 大于
np.greater_equal >= 大于等于
np.less < 小于
np.less_equal <= 小于等于
np.equal == 等于
np.not_equal != 不等于

这些函数支持广播,结果形状与广播后的形状一致。


六、高级索引与条件筛选

1. np.where(condition, [x, y])
  • 三参数形式:根据条件从 x 或 y 中选择元素(二者形状需可广播)。
  • 单参数形式:返回满足条件的元素的索引(以元组形式)。

a = np.arange(10)
np.where(a < 5, a, 10 * a) # 小于5保留原值,否则乘以10
np.where(a > 5) # 返回 (array([6, 7, 8, 9]),)


2. np.nonzero(a) 与 np.argwhere
  • np.nonzero 返回非零元素的索引元组,可用于花式索引。
  • np.argwhere 返回满足条件的索引构成的二维数组(每行为一个坐标)。

x = np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]])
x[np.nonzero(x)] # 提取非零元素: [3, 4, 5, 6]
np.argwhere(x > 1) # 返回坐标矩阵


3. 极值索引
函数说明
np.argmax(a, axis=None) 沿指定轴最大值的位置索引
np.argmin(a, axis=None) 沿指定轴最小值的位置索引

七、随机数生成模块(np.random)

函数说明
np.random.normal(loc=0.0, scale=1.0, size=None) 正态分布(指定均值与标准差)
np.random.randn(d0, d1, …) 标准正态分布(均0,方差1)
np.random.rand(d0, d1, …) 均匀分布 [0, 1)
np.random.randint(low, high=None, size=None) 离散均匀整数 [low, high)
np.random.uniform(low=0.0, high=1.0, size=None) 连续均匀分布 [low, high)
np.random.seed(x) 设置随机种子,确保结果可复现

np.random.seed(42)
np.random.normal(3, 2.5, size=(2, 4)) # 均值3,标准差2.5
np.random.randint(1, 4, size=(2, 3)) # 1~3的整数


八、点积与标量运算

  • np.dot(a, b):计算点积(一维向量内积,二维矩阵乘法)。
  • 数组与标量的运算:遵循逐元素规则,广播机制自动处理。

a = [1, 2, 3]
b = [1, 0, 2]
np.dot(a, b) # 1*1 + 2*0 + 3*2 = 7


总结

NumPy 的核心知识体系可归纳为:数组创建 → 属性查看 → 形状变换(变形/拼接/重复)→ 逐元素运算(含广播)→ 统计与数学函数 → 条件筛选与索引 → 随机数生成。初学者应优先掌握 array、arange、zeros/ones、reshape、索引切片、广播规则、sum/mean/max、where 以及 random 模块的基本用法,这些足以覆盖绝大多数日常数据分析与科学计算需求。

相较于 Python 原生列表,NumPy 的向量化操作与广播机制是其核心优势——应尽可能避免显式循环,而利用内置函数实现高效计算。以上内容系统性地介绍了 NumPy 的主要功能模块,建议结合动手练习以加深理解。如有进一步问题,欢迎随时讨论。

最后的最后,我们的python基础课到这里就结束了,针对大学生来说的话,这些内容其实就比较够用了。但是针对算法开发的工程师呢其实道途还是比较远的,在此之外还是需要学习完整的pandas以及各种算法的运用乃至数据的处理等;不过我后续还会继续更新numpy以及pandas的教程,不过这部分的内容我打算放在数据分析和机器学习里给大家介绍,感谢各位的支持!谢谢

下图为本文知识点的思维导图(示意):

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » python14(NumPy)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址