NumPy 基础知识

张开发
2026/4/8 22:03:37 15 分钟阅读

分享文章

NumPy 基础知识
1. NumPy 是什么NumPy 是 Python 的数值计算库核心是 ndarray多维数组。你可以把它理解为超级列表——比 Python 列表快 100 倍以上而且支持批量数学运算。2. 数组创建2.1 从列表创建importnumpyasnp anp.array([1,2,3,4,5])print(a)# [1 2 3 4 5]print(type(a))# class numpy.ndarray2.2 创建二维数组矩阵matrixnp.array([[1,2,3],[4,5,6],[7,8,9]])想象成一个表格1 2 34 5 67 8 92.3 常用快捷创建方式┌────────────────────┬────────────────┬───────────────────────────────┐ │ 函数 │ 作用 │ 例子 │ ├────────────────────┼────────────────┼───────────────────────────────┤ │ np.zeros((3,4))│ 全0矩阵 │3行4列的0│ ├────────────────────┼────────────────┼───────────────────────────────┤ │ np.ones((2,3))│ 全1矩阵 │2行3列的1│ ├────────────────────┼────────────────┼───────────────────────────────┤ │ np.full((3,4),7)│ 填充指定值 │3行4列全填7│ ├────────────────────┼────────────────┼───────────────────────────────┤ │ np.empty((3,4))│ 占位不初始化 │ 快速申请内存 │ ├────────────────────┼────────────────┼───────────────────────────────┤ │ np.eye(3)│ 单位矩阵 │ 对角线是1其余是0│ ├────────────────────┼────────────────┼───────────────────────────────┤ │ np.arange(0,10,2)│ 整数范围 │[0,2,4,6,8]指定步长 │ ├────────────────────┼────────────────┼───────────────────────────────┤ │ np.linspace(0,1,5)│ 等间隔 │[0,0.25,0.5,0.75,1]指定个数 │ └────────────────────┴────────────────┴───────────────────────────────┘2.4 随机数组np.random.randn(2,3)# 标准正态分布均值0标准差1np.random.rand(2,3)# 0~1之间均匀分布np.random.randn(2,3)生成2行3列的随机数大多数值在-3到3之间。神经网络训练前需要给权重赋初始值用随机数而不是全0可以让每个神经元学到不同的东西。 random.uniform — 均匀分布,任何值出现的概率一样完全公平的随机。 好比转盘抽奖每个格子大小一样落在哪里概率相同。 np.random.uniform(low0,high1,size(3,4))# low: 最小值默认0# high: 最大值默认1# size: 形状random.normal — 正态分布高斯分布。即中间多两边少大多数值集中在均值附近。 就好比全班考试成绩大多数人在70~80分极高极低的很少。常用于神经网络权重初始化。 np.random.normal(loc0,scale1,size(3,4))# loc: 均值中心在哪默认0# scale: 标准差散开程度默认1# size: 形状2.5 _like系列 — 按已有数组形状创建anp.array([[1,2,3],[4,5,6]])# shape (2, 3)np.zeros_like(a)# [[0,0,0],[0,0,0]] 同形状全0np.ones_like(a)# [[1,1,1],[1,1,1]] 同形状全1np.full_like(a,9)# [[9,9,9],[9,9,9]] 同形状全9np.empty_like(a)# 同形状值不确定什么时候用 不想手动写 shape直接跟着已有数组的形状走。# 典型场景创建和输入同形状的输出容器outputnp.zeros_like(input_data)3. 数组属性xnp.random.randn(3,4,5)x.shape# (3, 4, 5) 形状最常用x.ndim# 3 几维x.size# 60 元素总数 3×4×5x.dtype# float64 数据类型关于 shape 的写法(3,)表示一维数组有3个元素。逗号不能省因为 Python 中(3)只是数字3(3,)才是元组。 np.array([1,2,3]).shape# (3,) 一维np.array([[1,2,3]]).shape# (1, 3) 二维1行3列np.array([[1],[2],[3]]).shape# (3, 1) 二维3行1列4. 形状变换4.1 reshape — 改形状元素总数不变只是换一种排列方式anp.arange(12)# [ 0 1 2 ... 11]shape (12,)ba.reshape(3,4)# 变成 3行4列ca.reshape(2,3,2)# 变成 2×3×2 的三维-1可以自动推算 a.reshape(4,-1)# -1自动算出3 → shape (4, 3)a.reshape(-1,6)# -1自动算出2 → shape (2, 6)4.2 flatten — 展平成一维bnp.array([[1,2],[3,4]])b.flatten()# [1, 2, 3, 4]4.3 transpose — 转置行变列列变行matnp.array([[1,2,3],[4,5,6]])# shape (2, 3)mat.T# shape (3, 2)# [[1, 4],# [2, 5],# [3, 6]]4.4 增加/删除维度vecnp.array([1,2,3])# shape (3,)vec[np.newaxis,:].shape# (1, 3) 加一个行维度vec[:,np.newaxis].shape# (3, 1) 加一个列维度np.squeeze(vec[np.newaxis,:]).shape# (3,) 去掉大小为1的维度5. 数学运算5.1 元素级运算NumPy 数组之间的加减乘除是对应位置逐个计算的anp.array([1,2,3])bnp.array([4,5,6])ab# [5, 7, 9]a*b# [4, 10, 18] 不是矩阵乘法是逐个相乘a**2# [1, 4, 9]np.exp(a)# [e^1, e^2, e^3]5.2 矩阵乘法用 或 np.dot()规则是(m,n)(n,p)(m,p) Xnp.random.randn(4,3)# 4个样本3个特征Wnp.random.randn(3,5)# 权重矩阵YX W# shape (4, 5)注意区别 a*b# 逐元素相乘a b# 矩阵乘法内积6. 广播机制Broadcasting广播让形状不同的数组也能做运算NumPy 自动拉伸小的那个。就像你在公司发通知你写了一张纸条[涨薪10%, 涨薪20%, 涨薪30%]要发给3个部门每个部门4个人。你不需要手写12张复印3份就行。NumPy 的广播做的就是这件事——小的那个自动复印凑成和大的一样的形状然后再运算。6.1 标量广播anp.array([1,2,3])a10# [11, 12, 13] 10自动变成[10, 10, 10]6.2 一维 二维anp.array([[1,2,3],[4,5,6]])# shape (2, 3)bnp.array([10,20,30])# shape (3,)ab# 得到[[11, 22, 33],# [14, 25, 36]]# b 被复制了一行变成 [[10,20,30],[10,20,30]]6.3 广播规则从右往左对齐每个维度要么相等要么其中一个是1a: (2, 3)b: (3,) ← 从右对齐3对3可以左边缺的补1 → (1,3) → 拉伸成 (2,3)为什么是从右对齐因为短的那个从末尾开始对缺少的左边维度自动补1。有1就能拉伸维度是1的代表只有一个值复制多少份都不矛盾anp.array([[1,2,3],[4,5,6]])# shape (2, 3)bnp.array([[10],[20]])# shape (2, 1)ab# [[11, 12, 13],# [24, 25, 26]]# b 的列是1自动拉伸成3列[[10,10,10],[20,20,20]]7. axis 参数axis 告诉 NumPy 沿哪个方向操作。口诀axis几就是把第几个维度消掉。anp.array([[1,2,3],[4,5,6]])# shape (2, 3)axis0沿行方向从上往下压扁每列加起来123↓ ↓ ↓456---------579np.sum(a,axis0)# [5, 7, 9] shape (3,) 消掉了第0维(2行)axis1沿列方向从左往右压扁每行加起来1→2→364→5→615np.sum(a,axis1)# [6, 15] shape (2,) 消掉了第1维(3列)常用函数都支持 axisnp.sum、np.mean、np.max、np.min、np.argmax、np.sort。8. 统计函数datanp.array([[1,2,3],[4,5,6]])np.max(data)# 6 全局最大np.max(data,axis1)# [3, 6] 每行最大np.max(data,axis0)# [4, 5, 6] 每列最大np.mean(data)# 3.5 均值np.std(data)# 标准差np.sum(data)# 21 求和np.argmax(data,axis1)# [2, 2] 每行最大值的下标9. 数据类型转换anp.array([1.0,2.0,3.0])# 默认 float64a_f32a.astype(np.float32)# 转成 float32省内存10. np.indices — 给空间贴坐标np.indices((3,4,5)) 给一个 3×4×5 的空间里每个位置生成坐标返回3个矩阵分别存每个位置的第0维坐标、第1维坐标、第2维坐标。idxnp.indices((3,4,5))idx[0]→ 每个格子的层号idx[1]→ 每个格子的行号idx[2]→ 每个格子的列号好处是不用写循环直接批量计算 i,j,knp.indices((3,4,5))distancenp.sqrt(i**2j**2k**2)# 一行算出所有点到原点的距离▎ np.indices 就是提前把所有坐标算好存起来让你在做矩阵运算时能直接用坐标参与计算避免写多层 for 循环。如果你发现自己要写嵌套循环而且循环变量 i、j 本身要参与计算就可以考虑用它。

更多文章