尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

100 numpy exercises 实战指南:基于 NumPy 百题训练集掌握数组核心 API 与程序化文档生成

100 numpy exercises 实战指南:基于 NumPy 百题训练集掌握数组核心 API 与程序化文档生成 示例工程教程【免费下载链接】numpy-100100 numpy exercises (with solutions)项目地址https://gitcode.com/gh_mirrors/nu/numpy-100点击查看免费下载导读README.md 是 numpy-100 仓库的入口文档它定义了一套面向入门与进阶用户的100 道 NumPy 练习题集题目来源覆盖 NumPy 邮件列表、Stack Overflow 与官方文档。本文将以这份百题集为主体讲清它的三级难度体系、四种 Markdown 成品与两个 Jupyter Notebook 的形态差异并深入ktx键值文本数据源与 generators.py 的生成管线让你既能把它当作 NumPy 速查手册来刷题也能掌握一份源数据、程序化产出多份文档的工程思路。读完本文你将了解如何在本仓库中运行练习、如何查询提示与答案以及如何从source数据源重新生成全部文档。一、项目定位一份面向教学与自学的 NumPy 百题集根据 README 的说明numpy-100 是一份 collection of numpy exercises其题目来源有三类numpy mailing listNumPy 邮件列表中的经典讨论stack overflow社区高频问答中提炼出的实用技巧numpy documentation官方文档中的知识点。除此之外作者还自创了一部分题目以凑足 100 题。README 明确了这份题集的两大目标quick reference为新老用户提供一份可快速查阅的 NumPy 用法速查表exercises for teaching为教学者提供一套可直接用于课堂的练习题。仓库根目录的文件布局与 README 的描述完全对应文件角色100_Numpy_exercises.md纯题目版 Markdown无提示、无答案100_Numpy_exercises_with_hints.md带提示版100_Numpy_exercises_with_solutions.md带答案版100_Numpy_exercises_with_hints_with_solutions.md提示 答案版100_Numpy_exercises.ipynb顺序刷题版 Notebook100_Numpy_random.ipynb随机抽题版 Notebooksource/exercises100.ktx全部 100 题的源数据问题 q / 提示 h / 答案 asource/headers.ktx文档头部与使用说明等公共文本generators.py程序化生成器md / ipynb / 随机版initialise.pyNotebook 初始化脚本提供question/hint/answer/pick辅助函数requirements.txt生成文档所需的 Python 依赖清单二、难度体系从 ★☆☆ 到 ★★★ 的三级进阶每一道题都带有一个星级标记README 中虽未逐条列出但 100_Numpy_exercises.md 的完整题目清单可以清晰看到三级难度分布★☆☆基础共 33 题第 133 题覆盖导入包、查看版本、创建数组、基本索引切片、简单数学运算是零基础用户的入门路线★★☆进阶共 30 题第 3463 题涉及日期时间、结构化数组、广播、内存视图、文本文件读取等中阶主题★★★挑战第 64100 题共 36 题包括np.bincount累加、as_strided滑动窗口、einsum爱因斯坦求和、SVD 秩计算、Game of Life 向量化实现、Bootstrap 置信区间等高级技巧其中第 83 题未标注星级。这种星标 序号的编排使题目既可以顺序刷完也可以按难度跳读符合 README 所述quick reference for both old and new users的定位。三、快速上手两种 Notebook 的使用方式README 顶部提供了 Binder 在线运行入口同时在本地环境下仓库自带两个可直接打开的 Notebook。3.1 顺序刷题版100_Numpy_exercises.ipynb该 Notebook 由 generators.py 中的create_jupyter_notebook()程序化生成单元格结构为三个 Markdown 头部单元格header/sub_header/jupyter_instruction内容取自 source/headers.ktx一个代码单元格%run initialise.py完成初始化100 组题目 Markdown 单元格 空白代码单元格供你逐题作答。3.2 随机抽题版100_Numpy_random.ipynb由create_jupyter_notebook_random_question()生成结构类似但多出一个执行pick()的代码单元格每次运行会随机抽出一道题适合碎片时间自测。3.3 initialise.py 提供的四个辅助函数运行%run initialise.py之后即可在 Notebook 中使用 initialise.py 定义的四个函数import numpy as np import generators as ge def question(n): print(f{n}. ge.QHA[fq{n}]) def hint(n): print(ge.QHA[fh{n}]) def answer(n): print(ge.QHA[fa{n}]) def pick(): n np.random.randint(1, 100) question(n)用法对应关系与 source/headers.ktx 中jupyter_instruction的说明一致函数作用question(n)打印第 n 题的题目文本源自q{n}键hint(n)打印第 n 题的提示源自h{n}键answer(n)打印第 n 题的参考解答源自a{n}键pick()随机抽取一题并打印一个值得注意的实现细节从源码看pick()使用np.random.randint(1, 100)该调用返回[1, 100)区间内的整数因此它实际会在 199 号题之间随机选择第 100 题不会被随机抽中。这是从 initialise.py 的代码结构可以推断出的行为若希望覆盖全部 100 题可自行将上界改为 101。四、底层数据源ktx 键值文本格式README 特别强调了一个关键工程设计Markdown 与 Notebook 都不是手写的而是由source下的数据源程序化生成的。原文如下markdown and ipython notebook are created programmatically from the source data insource/exercises.ktx. To modify the content of these files, please change the text in the source and run thegenerators.pymodule with a python interpreter with the libraries underrequirements.txtinstalled.也就是说修改练习内容的正确姿势是改source数据源而不是直接编辑成品 Markdown。README 还给出了ktx的官方定义The keyed text format (ktx) is a minimal human readable key-values to store text (markdown or others) indexed by keys.ktx是一种极简的、人类可读的键值文本格式用于按 key 索引文本Markdown 或其他格式。其具体语法由 generators.py 中的ktx_to_dict()解析器定义def ktx_to_dict(input_file, keystarter): parsing keyed text to a python dictionary. answer dict() with open(input_file, r, encodingutf-8) as f: lines f.readlines() k, val , for line in lines: if line.startswith(keystarter): k line.replace(keystarter, ).strip() val else: val line if k: answer.update({k: val.strip()}) return answer解析规则非常直观以开头的行是键行后的内容即键名如 q1、 h1、 a1键行之后的所有非键行累积为该键的值直到遇到下一个键行最终产出一个 Python 字典。4.1 headers.ktx公共头部文本source/headers.ktx 定义了 4 个键键内容header标题与简介题目来源、目标读者、issue 反馈方式sub_headerFile automatically generated… 自动生成声明jupyter_instruction顺序版 Notebook 使用说明hint(n)/answer(n)jupyter_instruction_rand随机版 Notebook 使用说明pick()与提示/答案查询4.2 exercises100.ktx100 题的三键结构source/exercises100.ktx 是仓库的核心数据源为每一题维护三个键q{n}问题文本含星级标记如 q1→Import the numpy package under the namenp(★☆☆)h{n}提示如 h1→hint: import … as部分题目如 27、28、78、79、88、94 题的值是 No hints provided...即该题没有提示a{n}参考解答Python 代码如 a1→import numpy as np。这样一份 ktx 文件同时承载了题目 / 提示 / 答案三层信息后续通过生成器的开关自由组合出四种文档变体。五、程序化生成管线generators.py 源码解析generators.py 是整套文档的生产线在模块加载阶段就完成数据准备HEADERS ktx_to_dict(os.path.join(source, headers.ktx)) QHA ktx_to_dict(os.path.join(source, exercises100.ktx))5.1 create_jupyter_notebook顺序版 Notebooknb[cells].append(nbf.v4.new_markdown_cell(HEADERS[header])) nb[cells].append(nbf.v4.new_markdown_cell(HEADERS[sub_header])) nb[cells].append(nbf.v4.new_markdown_cell(HEADERS[jupyter_instruction])) nb[cells].append(nbf.v4.new_code_cell(%run initialise.py)) for n in range(1, 101): nb[cells].append(nbf.v4.new_markdown_cell(f#### {n}. QHA[fq{n}])) nb[cells].append(nbf.v4.new_code_cell())核心逻辑一目了然先写入 3 个头部 Markdown 单元格与 1 个初始化代码单元格然后循环range(1, 101)生成 100 组题目 空白作答单元格。实现上使用nbformat的 v4 API并在写出前删除同名旧文件os.remove避免残留。5.2 create_jupyter_notebook_random_question随机版 Notebook与顺序版几乎相同区别仅在于头部单元格使用jupyter_instruction_rand初始化之后追加一个执行pick()的代码单元格。5.3 create_markdown四种 Markdown 变体def create_markdown(destination_filename100_Numpy_exercises, with_hintsFalse, with_solutionsFalse): if with_hints: destination_filename _with_hints if with_solutions: destination_filename _with_solutions ... for n in range(1, 101): mdfile.new_header(titlef{n}. {QHA[fq{n}]}, level4, add_table_of_contentsn) if with_hints: mdfile.write(f{QHA[fh{n}]}) if with_solutions: mdfile.insert_code(QHA[fa{n}], languagepython)该函数通过with_hints/with_solutions两个布尔开关控制文件名后缀与内容with_hintswith_solutions产出文件FalseFalse100_Numpy_exercises.md纯题目TrueFalse100_Numpy_exercises_with_hints.mdFalseTrue100_Numpy_exercises_with_solutions.mdTrueTrue100_Numpy_exercises_with_hints_with_solutions.md提示以行内代码hint形式写入答案则以 python 代码块插入。这也解释了为何四种成品文件与仓库根目录一一对应。5.4main入口一次命令重建全部产物if __name__ __main__: create_jupyter_notebook() create_jupyter_notebook_random_question() create_markdown() create_markdown(with_hintsFalse, with_solutionsTrue) create_markdown(with_hintsTrue, with_solutionsFalse) create_markdown(with_hintsTrue, with_solutionsTrue)直接运行python generators.py即可一次性重建全部 6 个文件2 个 Notebook 4 个 Markdown。此外源码中还有一个未完成的create_rst()仅有pass占位注释提到 TODO说明 reStructuredText 输出仍在规划中。六、环境依赖与重建流程requirements.txt 列明了生成文档所需的精确依赖版本numpy1.17.4 pandas0.25.3 jupyter1.0.0 jupyterthemes0.20.0 mdutils1.0.0其中mdutils是 Markdown 生成所依赖的第三方库nbformat随jupyter一起安装用于 Notebook 生成。pandas 之所以出现在依赖中是因为第 68 题的解答提供了一个pd.Series(D).groupby(S).mean()的对照实现。重建流程与 README 的说明完全对应安装依赖pip install -r requirements.txt修改 source/exercises100.ktx 或 source/headers.ktx 中的文本执行python generators.py重新生成全部 Markdown 与 Notebook。需要说明的前提与限制依赖版本锁定在 2019 年末如numpy1.17.4若在更新的 Python / NumPy 环境中运行个别 API如np.random旧式全局随机接口可能已迁移此外第 75、76、81、84、87 题的部分解答明确标注需要NumPy 1.20.0numpy.lib.stride_tricks.sliding_window_view而requirements.txt锁定的 1.17.4 并不包含该函数实际使用时应以你本机安装的 NumPy 版本为准。七、内容纵览从 100 题看 NumPy 核心 API 覆盖面为体现这套题集的实用价值下面按主题抽取 source/exercises100.ktx 中的代表性题目与官方参考解答供读者快速评估其覆盖范围。7.1 数组创建与基础操作★☆☆第 3 题创建长度为 10 的零向量Z np.zeros(10) print(Z)第 7 题创建取值 1049 的向量Z np.arange(10, 50) print(Z)第 9 题创建 08 的 3×3 矩阵Z np.arange(9).reshape(3, 3) print(Z)第 21 题用 tile 生成棋盘格Z np.tile(np.array([[0, 1], [1, 0]]), (4, 4)) print(Z)7.2 特殊值与数值语义★☆☆第 17 题NaN / Inf 表达式求值——考察浮点特殊值的比较语义0 * np.nan # nan np.nan np.nan # False np.inf np.nan # False np.nan - np.nan # nan np.nan in set([np.nan]) # True 0.3 3 * 0.1 # False第 23 题自定义 RGBA 颜色 dtypecolor np.dtype([(r, np.ubyte), (g, np.ubyte), (b, np.ubyte), (a, np.ubyte)])7.3 索引、广播与就地运算★★☆第 22 题5×5 随机矩阵标准化Z np.random.random((5, 5)) Z (Z - np.mean(Z)) / (np.std(Z)) print(Z)第 36 题4 种方法提取正数数组的整数部分Z np.random.uniform(0, 10, 10) print(Z - Z % 1) print(Z // 1) print(np.floor(Z)) print(Z.astype(int)) print(np.trunc(Z))第 42 题allclose 与 array_equal 的区别A np.random.randint(0, 2, 5) B np.random.randint(0, 2, 5) equal np.allclose(A, B) # 容忍误差比较 equal np.array_equal(A, B) # 形状与取值严格相等第 58 题逐行减去行均值keepdims 广播X np.random.rand(5, 10) Y X - X.mean(axis1, keepdimsTrue) # 新版本写法 Y X - X.mean(axis1).reshape(-1, 1) # 旧版本兼容写法7.4 高级索引、统计与内存视图★★☆ / ★★★第 50 题查找向量中离标量最近的值Z np.arange(100) v np.random.uniform(0, 100) index (np.abs(Z - v)).argmin() print(Z[index])第 43 题让数组只读不可变Z np.zeros(10) Z.flags.writeable False Z[0] 1 # 此处将抛错第 64 题按索引向量逐元素加 1警惕重复索引Z np.ones(10) I np.random.randint(0, len(Z), 20) Z np.bincount(I, minlengthlen(Z)) # 另一解法 np.add.at(Z, I, 1)7.5 线性代数与 einsum★★★第 69 题点积的对角线三种性能档位A np.random.uniform(0, 1, (5, 5)) B np.random.uniform(0, 1, (5, 5)) np.diag(np.dot(A, B)) # Slow np.sum(A * B.T, axis1) # Fast np.einsum(ij,ji-i, A, B) # Faster第 82 题计算矩阵秩Z np.random.uniform(0, 1, (10, 10)) U, S, V np.linalg.svd(Z) rank np.sum(S 1e-10) # 更直接的替代方案 rank np.linalg.matrix_rank(Z)第 97 题用 einsum 重写 inner / outer / sum / mulnp.einsum(i-, A) # np.sum(A) np.einsum(i,i-i, A, B) # A * B np.einsum(i,i, A, B) # np.inner(A, B) np.einsum(i,j-ij, A, B) # np.outer(A, B)7.6 向量化综合应用★★★第 75 题滑动窗口均值cumsum 与 sliding_window_view 两种实现def moving_average(a, n3): ret np.cumsum(a, dtypefloat) ret[n:] ret[n:] - ret[:-n] return ret[n - 1:] / n # NumPy 1.20.0 的现代写法 from numpy.lib.stride_tricks import sliding_window_view print(sliding_window_view(Z, window_shape3).mean(axis-1))第 88 题用纯 NumPy 实现生命游戏Game of Lifedef iterate(Z): N (Z[0:-2, 0:-2] Z[0:-2, 1:-1] Z[0:-2, 2:] Z[1:-1, 0:-2] Z[1:-1, 2:] Z[2:, 0:-2] Z[2:, 1:-1] Z[2:, 2:]) birth (N 3) (Z[1:-1, 1:-1] 0) survive ((N 2) | (N 3)) (Z[1:-1, 1:-1] 1) Z[...] 0 Z[1:-1, 1:-1][birth | survive] 1 return Z第 100 题Bootstrap 法计算均值 95% 置信区间X np.random.randn(100) # 随机 1D 数组 N 1000 # bootstrap 重采样次数 idx np.random.randint(0, X.size, (N, X.size)) means X[idx].mean(axis1) confint np.percentile(means, [2.5, 97.5]) print(confint)八、典型应用场景结合 README 的定位与仓库结构这套百题集适用于三类场景个人速查与自测打开 100_Numpy_exercises.md 逐题作答卡壳时再对照 100_Numpy_exercises_with_hints.md 的提示与 100_Numpy_exercises_with_solutions.md 的答案课堂教学直接使用带提示/答案的变体作为习题课材料题目的星标难度便于分层布置文档生成工程参考ktx数据源 generators.py的一份数据、多份成品模式为需要维护多格式文档Markdown / Notebook / 其他的项目提供了轻量级范本。九、许可与衍生版本README 末尾声明本项目采用MIT License见 LICENSE.txt并提及存在Julia 语言的同名衍生练习集100 Julia Exercises。这意味着在遵守 MIT 许可的前提下可以借鉴其题目设计或数据源结构生成其他语言如 Julia的练习集这也与仓库面向教学的目标一脉相承。赞分享示例工程教程【免费下载链接】numpy-100100 numpy exercises (with solutions)项目地址https://gitcode.com/gh_mirrors/nu/numpy-100点击查看免费下载相关推荐numpy-100 实战指南100 道 NumPy 编程练习题完整精讲含提示与解答numpy 100 实战指南100 道 NumPy 编程练习题完整精讲含提示与解答 本文以本仓库的核心文档 100_Numpy_exercises_wit示例工程教程NumPy 100 题精讲基于 numpy-100 开源仓库的从入门到进阶完整练习指南NumPy 100 题精讲基于 numpy 100 开源仓库的从入门到进阶完整练习指南 本文以 numpy 100 https://link.gitcode.示例工程教程10分钟掌握NumPy数组基础操作从入门到精通的完整指南10分钟掌握NumPy数组基础操作从入门到精通的完整指南 NumPy数组是数据科学领域不可或缺的核心工具它提供了高效的多维数组操作能力是Python数据分示例工程教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表