当前位置:首页>python>32岁零基础学Python量化第4周:NumPy核心知识点一网打尽(附练习题)

32岁零基础学Python量化第4周:NumPy核心知识点一网打尽(附练习题)

  • 2026-10-11 05:48:28
32岁零基础学Python量化第4周:NumPy核心知识点一网打尽(附练习题)

Python 原生列表、元组等数据结构虽灵活,但在进行大规模数值计算时存在明显瓶颈,引入NumPy库解决了原生Python循环慢,内存效率低,缺乏多维数组支持,缺少常用数学/线性代数函数等问题,让Python真正具备了高效数值计算的能力。

NumPy和Pandas相关内容我看的是B站的爆肝杰哥的Python相关系列课程,课程新手友好度很高,尤其是开头环境配置方面小白跟着做完全没有问题,主要了解NumPy和Pandas相关内容,关于软件使用和环境配置相关内容就另做记录了,感兴趣的同学可以自行查找课程学习。
  • NumPy 知识点归纳

1、数组基础

  • 数据类型:一个数组只能容纳一种类型(整数/浮点)优点是节约内存。

    • 整数数组插入浮点数 → 浮点数截断为整数;(随大流)

    • 浮点数组插入整数 → 整数升级为浮点数。(随大流)

    • 类型转换:.astype(float) / .astype(int)

    • import numpy as nparr1 = np.array([1,2,3])arr2 = np.array([1.0,2,3])print(arr1)print(arr2)。输出结果:[1 2 3][1. 2. 3.]  print 输出numpy数组后元素之间没有逗号间隔,有两个好处,一是可以与Python列表进行区分,二是避免逗号与小数点之间混淆。

  • 数组维度:

    • 一维(向量):一层[],形状 (n,)

    • 二维(矩阵):两层[],形状 (m,n)  行列式,m是行,n是列

    • 三维:三层[],形状 (a,b,c)

    • 查看形状:.shape

  • 维度转换:.reshape(new_shape),可用 -1 自动推算维度。

2、数组的创建

函数
说明
np.array([...])
从列表创建
np.arange(start,stop,step)
递增序列
np.zeros(shape)
 / np.ones(shape)
全0 / 全1(浮点型)
np.random.random(shape)
[0,1) 均匀分布
np.random.randint(low,high,shape)
整数随机
np.random.normal(loc(均值),scale(标准差),size(形状,各个维度均可))
正态分布
np.linspace(起始值(包含), 结束值(包含), 要生成的元素个数)
生成一个等间隔的一维数组

3、数组的索引

  • 普通索引:arr[pos](向量),arr[row,col](矩阵)

  • 花式索引:用列表索引,返回向量,对应关系arr[[i1,i2,...]](向量),arr[[r1,r2,...],[c1,c2,...]](矩阵)

    解释:arr2[[0,1],[0,1]] 相当于分别索引arr2[0,0],arr2[1,1]然后再将其手动组合成一个数组:np.array([arr2[0,0],arr2[1,1]])

  • 切片:[start:stop:step]

    • 行列索引正数开头是0,倒数第一个为-1,切片索引包括开头但不包括结尾:如:arr为4行5列矩阵,arr[1:3,1:-1] 的意思就是:选取第1行到第2行(首行为第0行),同时选取第1列到倒数第2列(首列为第0列),重合的部分就是我们要切片出来的矩阵

    • 矩阵切片:arr[行切片, 列切片]

    • 提取行:arr[row] 简写;提取列:arr[:, col](返回向量)

  • 视图与拷贝:切片是原数组的视图,修改切片会影响原数组。

    • 需独立副本:.copy()方法

  • 赋值是绑定:arr2 = arr1 不复制数据,修改任一影响另一个。

4、数组的变形

5、数组的运算

  • 与系数:+ - * / ** // % 逐元素运算

  • 数组间:对应元素运算(形状相同)

  • 广播:不同形状运算时自动扩展

    • 向量( ,n) 与矩阵(m,n) → 向量扩展为(m,n)

    • 列矩阵(m,1) 与矩阵(m,n) → 列扩展为(m,n)

    • 行矩阵(1,n) 与列矩阵(m,1) → 两者扩展为(m,n)

6、数组的函数

  • 矩阵乘积:np.dot(a,b)  点乘

    • 向量·向量 → 标量

      arr1 = [0 1 2 3 4]  arr2 = [0 1 2 3 4]   np.dot(arr1,arr2) = 30 

    • 向量·矩阵 → 向量   

      arr1 = np.arange(3)   arr2 = np.arange(6).reshape(3,2)     

      arr1 =[0 1 2 ]   arr2 =[[0 1]

                                         [2 3]    

                                         [4 5]]

      np.dot(arr1,arr2) = arr1·arr2 =[10 13]

    • 矩阵·向量 → 向量    

    • 矩阵·矩阵 → 矩阵  (5,2)x(2,8)=(5,8)

      关于矩阵的运算,推荐一个3Blue1Brown的线性代数的本质视频,很直观,感兴趣可以去B站观看直接搜以下内容:-UP主汉语配音-【线性代数的本质】合集-转载于3Blue1Brown官方双语

  • 数学函数:np.abs, np.sin/cos/tan, np.exp, np.log(自然对数)

  • 聚合函数:np.max/min, np.sum, np.prod, np.mean, np.std

    • axis 参数:axis=0 按列(竖着求),axis=1 按行(横着求)

    • 安全版本(忽略NaN):np.nansum, np.nanmean 等

7、布尔型数组

  • 创建:比较运算(>, >=, ==, !=, <, <=)多条件:&(与)、|(或)、~(非)

  • 计算布尔型数组True 的数量:np.sum(布尔数组)

  • 任意/全真:np.any(布尔数组)(只要有一个True则返回True)、np.all(布尔数组)(全为True则返回True)

  • 掩码:arr[布尔数组] 筛选出True位置的元素

  • 位置索引:np.where(条件) 返回满足条件的元素下标(元组)

    表示随机生成的这样一组正态分布的数组中大于650的元素所在位置,输出是一个元组,第一个元素是满足条件的元素所在位置,第二个元素是数组类型可忽略。

8、NumPy → PyTorch 类比

PyTorch作为当前首屈一指的深度学习库,其将NumPy的语法尽数吸收作为自己处理数组的基本语法,且运算速度从使用CPU的数组进步到使用GPU的张量,Numpy和Pytorch基础语法对应关系如下:

  • np → torch,array → tensor

  • 转换:torch.tensor(arr) / np.array(ts)

  • NumPy 的n 维数组对应着PyTorch 的n 阶张量

  • 差异:.astype() → .type(),.copy() → .clone(),np.concatenate() → torch.cat(),矩阵乘法用 torch.matmul() 等。

以上笔记均根据爆肝杰哥Python讲义内容归纳而来,需仔细学习的伙伴建议去B站找课程学习;
  • NumPy相关练习题
    题1:关于广播机制,下列哪个运算合法?

    A. 形状 (3,4) 与 (4,1) 的数组相加

    B. 形状 (2,3) 与 (2,) 的数组相乘

    C. 形状 (5,) 与 (5,2) 的数组相减

    D. 形状 (3,1) 与 (3,2) 的数组相除

    解析:此题答案为D,但我错选了B,要求尾部对齐后向前逐个比较维度,要么相等要么其中一个为1(可广播),满足任一条件即合法。

    A:尾部对齐,倒数第1维4 vs 1 ,1可以广播,倒数第2维 3 vs 4 不相等且均不为1,不可广播;

    B:(2,)为1维,尾部对齐时其唯一维度对应(2,3)的最后一维(列数:3),3vs2 不相等且均不为1  不合法;

    C:(5,) 与(5,2) 尾部对齐后5 vs  2 不相等且均不为1  不合法;

    D:(3,1) 与 (3,2) 对其后3 vs 3相等,合法, 1 vs 2不相等但有1,可广播。

    题2:将一维数组 v 升级为行矩阵(1行多列)的正确 reshape 写法是 v.reshape(1, -1)  或者v.reshape(1, len(v))
    题3:在 NumPy 中,arr[布尔数组]操作中,布尔数组充当:掩码(mask)角色。
    题4:写出以下代码的输出结果:
    x = np.array([1,2,3])y = np.array([[4],[5],[6]])print(x * y)
    解析:此题利用广播,逐元素相乘后得:
    [[ 4  8 12]  [ 5 10 15]  [ 6 12 18]]
    题5:如何将一个形状为 (4,6) 的矩阵展平为一维向量,给出两种写法?              答:arr.reshape(-1) 或 arr.flatten()
    题6:
    1.生成一个 8×8 的随机整数矩阵(范围 0~100),然后:
    2.提取第3行(索引2)
    3.提取第5列(索引4)
    4.将矩阵右上角 4×4 子块全部替换为 0
    5.计算整个矩阵的最大值、最小值、均值和标准差
    答题:
    arr = np.random.randint(0,101,size=(8,8))print(arr[2,:])#提取第三行print(arr[:,4]) #提取第五列arr[:3,-4:] = 0 #右上角4*4子块全部替换为0print(np.max(arr))#求array整体最大值print(np.min(arr))#求array整体最小值print(np.mean(arr))#求array整体平均值print(np.std(arr)) #求array整体标准差
    题7:1.创建一个长度为 1000 的一维数组,元素服从均值为 170、标准差为     10 的正态分布(模拟身高)。2.统计身高在 160~180 之间的人数3.输出所有身高超过 190 的索引位置4.判断是否所有身高都大于 140
    答题:
    arr = np.random.normal(170,10,1000)print(np.sum((arr>160)&(arr<180)))  print(np.where(arr>190))print(np.all(arr>140)) 

    注:第2题np.sum(arr>160 & arr<180),np.sum(160<arr<180)写法都不对,因为运算符&的优先级高于比较运算符>,<,不加括号会优先计算160&arr

  • 重难点总结

    1.浮点数和整数数组中插入浮点数或者整数时,插入值数据类型会跟随数组,简称‘随大流’。

    2.NumPy数组切片是原数组的视图(view),只是原数据的一个视窗,是一种引用,修改切片内容会影响原数组,

    除非使用.copy()方法新建出一个相同数组进行操作才不会影响原数组;

    而Python的列表切片属于新列表(浅拷贝)会重新分配新内存,复制元素,修改切片不会影响原列表。

NumPy这样设计可以节约内存,防止操作大数据时造成大量内存浪费。
3.关于np.sum(arr,axis=?)的解释:
np.sum(arr, axis=0)沿着第0轴(行方向)即对每一列求和,每列的和落在横坐标上,和的数据是一排的。
np.sum(arr, axis=1) ,沿着第1轴(列方向)即对每一行求和,每行的和落在纵坐标上,和的数据是一列的。
4.注意分清 np.dot(arr1,arr2)  和arr1*arr2 的区别:
np.dot(arr1,arr2)
arr1*arr2
定义
矩阵乘法(点积)
对应位置元素相乘
size要求
arr1列数 = arr2行数(二维)
尾部对齐后逐个对应维度,要么相等要么其中一个为1(可广播)
size示例
(m,n)dot(n,p)→(m,p)
(m,n)* (m,1)→(m,n)
用法情景
线性变换、神经网络全连接层、向量点积
特征缩放、掩码操作、逐元素加权
此篇需要题目做练习的同学可以私信我发题目和答案,本篇NumPy学完,下面将继续Pandas库的学习,对于本篇各位同学和前辈有什么心得或建议欢迎留言一起交流。
谢谢看完,晚安~

最新文章

随机文章