[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-srush--Tensor-Puzzles":3,"tool-srush--Tensor-Puzzles":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",146793,2,"2026-04-08T23:32:35",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108111,"2026-04-08T11:23:26",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":78,"owner_email":79,"owner_twitter":80,"owner_website":81,"owner_url":82,"languages":83,"stars":92,"forks":93,"last_commit_at":94,"license":95,"difficulty_score":96,"env_os":97,"env_gpu":98,"env_ram":97,"env_deps":99,"category_tags":108,"github_topics":109,"view_count":32,"oss_zip_url":112,"oss_zip_packed_at":112,"status":17,"created_at":113,"updated_at":114,"faqs":115,"releases":156},5797,"srush\u002FTensor-Puzzles","Tensor-Puzzles","Solve puzzles. Improve your pytorch.","Tensor-Puzzles 是一套专为提升 PyTorch 和 NumPy 编程能力设计的互动练习集，由知名学者 Sasha Rush 等人开发。它通过 21 个精心设计的“张量谜题”，帮助学习者摆脱对标准库函数或网络搜索的依赖，转而深入理解张量运算的核心机制。\n\n许多开发者在处理数组操作时，习惯于直接调用现成函数，却忽略了底层广播（broadcasting）机制的强大表达力。Tensor-Puzzles 正是为了解决这一痛点而生：每个谜题要求用户在严格限制下（如仅限一行代码、禁止使用 sum\u002Fview 等高级函数），仅利用基础算术、索引和广播规则，重新实现常见的 NumPy 功能。这种类似“象棋残局”的训练方式，能在简化环境中高效锻炼逻辑思维与向量化编程技巧。\n\n该工具特别适合正在学习深度学习框架的开发者、研究人员及学生使用。其独特亮点在于强制性的约束规则——例如必须用广播替代循环、用数学运算替代条件判断，从而迫使用户掌握“第一性原理”式的编程思维。项目支持在 Google Colab 中直接运行，并配有详细的可视化示例和视频讲解，让抽象的张量变换过程变得直观易懂。无论是想夯实基础","Tensor-Puzzles 是一套专为提升 PyTorch 和 NumPy 编程能力设计的互动练习集，由知名学者 Sasha Rush 等人开发。它通过 21 个精心设计的“张量谜题”，帮助学习者摆脱对标准库函数或网络搜索的依赖，转而深入理解张量运算的核心机制。\n\n许多开发者在处理数组操作时，习惯于直接调用现成函数，却忽略了底层广播（broadcasting）机制的强大表达力。Tensor-Puzzles 正是为了解决这一痛点而生：每个谜题要求用户在严格限制下（如仅限一行代码、禁止使用 sum\u002Fview 等高级函数），仅利用基础算术、索引和广播规则，重新实现常见的 NumPy 功能。这种类似“象棋残局”的训练方式，能在简化环境中高效锻炼逻辑思维与向量化编程技巧。\n\n该工具特别适合正在学习深度学习框架的开发者、研究人员及学生使用。其独特亮点在于强制性的约束规则——例如必须用广播替代循环、用数学运算替代条件判断，从而迫使用户掌握“第一性原理”式的编程思维。项目支持在 Google Colab 中直接运行，并配有详细的可视化示例和视频讲解，让抽象的张量变换过程变得直观易懂。无论是想夯实基础的初学者，还是希望精进代码效率的资深工程师，都能从中获得实质性的提升。","# Tensor Puzzles\n- by [Sasha Rush](http:\u002F\u002Frush-nlp.com) - [srush_nlp](https:\u002F\u002Ftwitter.com\u002Fsrush_nlp) (with Marcos Treviso)\n\n\n\n\nWhen learning a tensor programming language like PyTorch or Numpy it\nis tempting to rely on the standard library (or more honestly\nStackOverflow) to find a magic function for everything.  But in\npractice, the tensor language is extremely expressive, and you can\ndo most things from first principles and clever use of broadcasting.\n\n\nThis is a collection of 21 tensor puzzles. Like chess puzzles these are\nnot meant to simulate the complexity of a real program, but to practice\nin a simplified environment. Each puzzle asks you to reimplement one\nfunction in the NumPy standard library without magic. \n\n\nI recommend running in Colab. Click here and copy the notebook to get start.\n\n[![Open In Colab](https:\u002F\u002Fcolab.research.google.com\u002Fassets\u002Fcolab-badge.svg)](https:\u002F\u002Fcolab.research.google.com\u002Fgithub\u002Fsrush\u002FTensor-Puzzles\u002Fblob\u002Fmain\u002FTensor%20Puzzlers.ipynb)\n\nIf you are interested, there is also a youtube walkthrough of the puzzles \n\n[![Watch the video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fsrush_Tensor-Puzzles_readme_ce62f52c040f.jpg)](https:\u002F\u002Fyoutu.be\u002FHafo7hIl8MU)\n\n```python\n!pip install -qqq torchtyping hypothesis pytest git+https:\u002F\u002Fgithub.com\u002Fdanoneata\u002Fchalk@srush-patch-1\n!wget -q https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fraw\u002Fmain\u002Flib.py\n```\n\n\n```python\nfrom lib import draw_examples, make_test, run_test\nimport torch\nimport numpy as np\nfrom torchtyping import TensorType as TT\ntensor = torch.tensor\n```\n\n## Rules\n\n1. These puzzles are about *broadcasting*. Know this rule.\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fsrush_Tensor-Puzzles_readme_249c115c5ffa.png)\n\n2. Each puzzle needs to be solved in 1 line (\u003C80 columns) of code.\n3. You are allowed @, arithmetic, comparison, `shape`, any indexing (e.g. `a[:j], a[:, None], a[arange(10)]`), and previous puzzle functions.\n4. You are *not allowed* anything else. No `view`, `sum`, `take`, `squeeze`, `tensor`.\n\n5. You can start with these two functions:\n\n\n```python\ndef arange(i: int):\n    \"Use this function to replace a for-loop.\"\n    return torch.tensor(range(i))\n\ndraw_examples(\"arange\", [{\"\" : arange(i)} for i in [5, 3, 9]])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_7_0.svg)\n    \n\n\n\n\n```python\n# Example of broadcasting.\nexamples = [(arange(4), arange(5)[:, None]) ,\n            (arange(3)[:, None], arange(2))]\ndraw_examples(\"broadcast\", [{\"a\": a, \"b\":b, \"ret\": a + b} for a, b in examples])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_8_0.svg)\n    \n\n\n\n\n```python\ndef where(q, a, b):\n    \"Use this function to replace an if-statement.\"\n    return (q * a) + (~q) * b\n\n# In diagrams, orange is positive\u002FTrue, where is zero\u002FFalse, and blue is negative.\n\nexamples = [(tensor([False]), tensor([10]), tensor([0])),\n            (tensor([False, True]), tensor([1, 1]), tensor([-10, 0])),\n            (tensor([False, True]), tensor([1]), tensor([-10, 0])),\n            (tensor([[False, True], [True, False]]), tensor([1]), tensor([-10, 0])),\n            (tensor([[False, True], [True, False]]), tensor([[0], [10]]), tensor([-10, 0])),\n           ]\ndraw_examples(\"where\", [{\"q\": q, \"a\":a, \"b\":b, \"ret\": where(q, a, b)} for q, a, b in examples])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_9_0.svg)\n    \n\n\n\n## Puzzle 1 - ones\n\nCompute [ones](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.ones.html) - the vector of all ones.\n\n\n```python\ndef ones_spec(out):\n    for i in range(len(out)):\n        out[i] = 1\n        \ndef ones(i: int) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_ones = make_test(\"one\", ones, ones_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_11_0.svg)\n    \n\n\n\n```python\n# run_test(test_ones)\n```\n\n## Puzzle 2 - sum\n\nCompute [sum](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.sum.html) - the sum of a vector.\n\n\n```python\ndef sum_spec(a, out):\n    out[0] = 0\n    for i in range(len(a)):\n        out[0] += a[i]\n        \ndef sum(a: TT[\"i\"]) -> TT[1]:\n    raise NotImplementedError\n\n\ntest_sum = make_test(\"sum\", sum, sum_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_14_0.svg)\n    \n\n\n\n```python\n# run_test(test_sum)\n```\n\n## Puzzle 3 - outer\n\nCompute [outer](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.outer.html) - the outer product of two vectors.\n\n\n```python\ndef outer_spec(a, b, out):\n    for i in range(len(out)):\n        for j in range(len(out[0])):\n            out[i][j] = a[i] * b[j]\n            \ndef outer(a: TT[\"i\"], b: TT[\"j\"]) -> TT[\"i\", \"j\"]:\n    raise NotImplementedError\n    \ntest_outer = make_test(\"outer\", outer, outer_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_17_0.svg)\n    \n\n\n\n```python\n# run_test(test_outer)\n```\n\n## Puzzle 4 - diag\n\nCompute [diag](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.diag.html) - the diagonal vector of a square matrix.\n\n\n```python\ndef diag_spec(a, out):\n    for i in range(len(a)):\n        out[i] = a[i][i]\n        \ndef diag(a: TT[\"i\", \"i\"]) -> TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_diag = make_test(\"diag\", diag, diag_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_20_0.svg)\n    \n\n\n\n```python\n# run_test(test_diag)\n```\n\n## Puzzle 5 - eye\n\nCompute [eye](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.eye.html) - the identity matrix.\n\n\n```python\ndef eye_spec(out):\n    for i in range(len(out)):\n        out[i][i] = 1\n        \ndef eye(j: int) -> TT[\"j\", \"j\"]:\n    raise NotImplementedError\n    \ntest_eye = make_test(\"eye\", eye, eye_spec, add_sizes=[\"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_23_0.svg)\n    \n\n\n\n```python\n# run_test(test_eye)\n```\n\n## Puzzle 6 - triu\n\nCompute [triu](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.triu.html) - the upper triangular matrix.\n\n\n```python\ndef triu_spec(out):\n    for i in range(len(out)):\n        for j in range(len(out)):\n            if i \u003C= j:\n                out[i][j] = 1\n            else:\n                out[i][j] = 0\n                \ndef triu(j: int) -> TT[\"j\", \"j\"]:\n    raise NotImplementedError\n\n\ntest_triu = make_test(\"triu\", triu, triu_spec, add_sizes=[\"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_26_0.svg)\n    \n\n\n\n```python\n# run_test(test_triu)\n```\n\n## Puzzle 7 - cumsum\n\nCompute [cumsum](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.cumsum.html) - the cumulative sum.\n\n\n```python\ndef cumsum_spec(a, out):\n    total = 0\n    for i in range(len(out)):\n        out[i] = total + a[i]\n        total += a[i]\n\ndef cumsum(a: TT[\"i\"]) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_cumsum = make_test(\"cumsum\", cumsum, cumsum_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_29_0.svg)\n    \n\n\n\n```python\n# run_test(test_cumsum)\n```\n\n## Puzzle 8 - diff\n\nCompute [diff](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.diff.html) - the running difference.\n\n\n```python\ndef diff_spec(a, out):\n    out[0] = a[0]\n    for i in range(1, len(out)):\n        out[i] = a[i] - a[i - 1]\n\ndef diff(a: TT[\"i\"], i: int) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_diff = make_test(\"diff\", diff, diff_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_32_0.svg)\n    \n\n\n\n```python\n# run_test(test_diff)\n```\n\n## Puzzle 9 - vstack\n\nCompute [vstack](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.vstack.html) - the matrix of two vectors\n\n\n```python\ndef vstack_spec(a, b, out):\n    for i in range(len(out[0])):\n        out[0][i] = a[i]\n        out[1][i] = b[i]\n\ndef vstack(a: TT[\"i\"], b: TT[\"i\"]) -> TT[2, \"i\"]:\n    raise NotImplementedError\n\n\ntest_vstack = make_test(\"vstack\", vstack, vstack_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_35_0.svg)\n    \n\n\n\n```python\n# run_test(test_vstack)\n```\n\n## Puzzle 10 - roll\n\nCompute [roll](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.roll.html) - the vector shifted 1 circular position.\n\n\n```python\ndef roll_spec(a, out):\n    for i in range(len(out)):\n        if i + 1 \u003C len(out):\n            out[i] = a[i + 1]\n        else:\n            out[i] = a[i + 1 - len(out)]\n            \ndef roll(a: TT[\"i\"], i: int) -> TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_roll = make_test(\"roll\", roll, roll_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_38_0.svg)\n    \n\n\n\n```python\n# run_test(test_roll)\n```\n\n## Puzzle 11 - flip\n\nCompute [flip](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.flip.html) - the reversed vector\n\n\n```python\ndef flip_spec(a, out):\n    for i in range(len(out)):\n        out[i] = a[len(out) - i - 1]\n        \ndef flip(a: TT[\"i\"], i: int) -> TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_flip = make_test(\"flip\", flip, flip_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_41_0.svg)\n    \n\n\n\n```python\n# run_test(test_flip)\n```\n\n## Puzzle 12 - compress\n\n\nCompute [compress](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.compress.html) - keep only masked entries (left-aligned).\n\n\n```python\ndef compress_spec(g, v, out):\n    j = 0\n    for i in range(len(g)):\n        if g[i]:\n            out[j] = v[i]\n            j += 1\n            \ndef compress(g: TT[\"i\", bool], v: TT[\"i\"], i:int) -> TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_compress = make_test(\"compress\", compress, compress_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_44_0.svg)\n    \n\n\n\n```python\n# run_test(test_compress)\n```\n\n## Puzzle 13 - pad_to\n\n\nCompute pad_to - eliminate or add 0s to change size of vector.\n\n\n```python\ndef pad_to_spec(a, out):\n    for i in range(min(len(out), len(a))):\n        out[i] = a[i]\n\n\ndef pad_to(a: TT[\"i\"], i: int, j: int) -> TT[\"j\"]:\n    raise NotImplementedError\n\n\ntest_pad_to = make_test(\"pad_to\", pad_to, pad_to_spec, add_sizes=[\"i\", \"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_47_0.svg)\n    \n\n\n\n```python\n# run_test(test_pad_to)\n```\n\n## Puzzle 14 - sequence_mask\n\n\nCompute [sequence_mask](https:\u002F\u002Fwww.tensorflow.org\u002Fapi_docs\u002Fpython\u002Ftf\u002Fsequence_mask) - pad out to length per batch.\n\n\n```python\ndef sequence_mask_spec(values, length, out):\n    for i in range(len(out)):\n        for j in range(len(out[0])):\n            if j \u003C length[i]:\n                out[i][j] = values[i][j]\n            else:\n                out[i][j] = 0\n    \ndef sequence_mask(values: TT[\"i\", \"j\"], length: TT[\"i\", int]) -> TT[\"i\", \"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_length(d):\n    d[\"length\"] = d[\"length\"] % d[\"values\"].shape[1]\n    return d\n\n\ntest_sequence = make_test(\"sequence_mask\",\n    sequence_mask, sequence_mask_spec, constraint=constraint_set_length\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_50_0.svg)\n    \n\n\n\n```python\n# run_test(test_sequence)\n```\n\n## Puzzle 15 - bincount\n\nCompute [bincount](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.bincount.html) - count number of times an entry was seen.\n\n\n```python\ndef bincount_spec(a, out):\n    for i in range(len(a)):\n        out[a[i]] += 1\n        \ndef bincount(a: TT[\"i\"], j: int) -> TT[\"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_max(d):\n    d[\"a\"] = d[\"a\"] % d[\"return\"].shape[0]\n    return d\n\n\ntest_bincount = make_test(\"bincount\",\n    bincount, bincount_spec, add_sizes=[\"j\"], constraint=constraint_set_max\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_53_0.svg)\n    \n\n\n\n```python\n# run_test(test_bincount)\n```\n\n## Puzzle 16 - scatter_add\n\nCompute [scatter_add](https:\u002F\u002Fpytorch-scatter.readthedocs.io\u002Fen\u002F1.3.0\u002Ffunctions\u002Fadd.html) - add together values that link to the same location.\n\n\n```python\ndef scatter_add_spec(values, link, out):\n    for j in range(len(values)):\n        out[link[j]] += values[j]\n        \ndef scatter_add(values: TT[\"i\"], link: TT[\"i\"], j: int) -> TT[\"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_max(d):\n    d[\"link\"] = d[\"link\"] % d[\"return\"].shape[0]\n    return d\n\n\ntest_scatter_add = make_test(\"scatter_add\",\n    scatter_add, scatter_add_spec, add_sizes=[\"j\"], constraint=constraint_set_max\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_56_0.svg)\n    \n\n\n\n```python\n# run_test(test_scatter_add)\n```\n\n## Puzzle 17 - flatten\n\nCompute [flatten](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.ndarray.flatten.html)\n\n\n```python\ndef flatten_spec(a, out):\n    k = 0\n    for i in range(len(a)):\n        for j in range(len(a[0])):\n            out[k] = a[i][j]\n            k += 1\n\ndef flatten(a: TT[\"i\", \"j\"], i:int, j:int) -> TT[\"i * j\"]:\n    raise NotImplementedError\n\ntest_flatten = make_test(\"flatten\", flatten, flatten_spec, add_sizes=[\"i\", \"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_59_0.svg)\n    \n\n\n\n```python\n# run_test(test_flatten)\n```\n\n## Puzzle 18 - linspace\n\nCompute [linspace](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.linspace.html)\n\n\n```python\ndef linspace_spec(i, j, out):\n    for k in range(len(out)):\n        out[k] = float(i + (j - i) * k \u002F max(1, len(out) - 1))\n\ndef linspace(i: TT[1], j: TT[1], n: int) -> TT[\"n\", float]:\n    raise NotImplementedError\n\ntest_linspace = make_test(\"linspace\", linspace, linspace_spec, add_sizes=[\"n\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_62_0.svg)\n    \n\n\n\n```python\n# run_test(test_linspace)\n```\n\n## Puzzle 19 - heaviside\n\nCompute [heaviside](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.heaviside.html)\n\n\n```python\ndef heaviside_spec(a, b, out):\n    for k in range(len(out)):\n        if a[k] == 0:\n            out[k] = b[k]\n        else:\n            out[k] = int(a[k] > 0)\n\ndef heaviside(a: TT[\"i\"], b: TT[\"i\"]) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_heaviside = make_test(\"heaviside\", heaviside, heaviside_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_65_0.svg)\n    \n\n\n\n```python\n# run_test(test_heaviside)\n```\n\n## Puzzle 20 - repeat (1d)\n\nCompute [repeat](https:\u002F\u002Fpytorch.org\u002Fdocs\u002Fstable\u002Fgenerated\u002Ftorch.Tensor.repeat.html)\n\n\n```python\ndef repeat_spec(a, d, out):\n    for i in range(d[0]):\n        for k in range(len(a)):\n            out[i][k] = a[k]\n\ndef constraint_set(d):\n    d[\"d\"][0] = d[\"return\"].shape[0]\n    return d\n\n            \ndef repeat(a: TT[\"i\"], d: TT[1]) -> TT[\"d\", \"i\"]:\n    raise NotImplementedError\n\ntest_repeat = make_test(\"repeat\", repeat, repeat_spec, constraint=constraint_set)\n```\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_68_0.svg)\n\n## Puzzle 21 - bucketize\n\nCompute [bucketize](https:\u002F\u002Fpytorch.org\u002Fdocs\u002Fstable\u002Fgenerated\u002Ftorch.bucketize.html)\n\n```python\ndef bucketize_spec(v, boundaries, out):\n    for i, val in enumerate(v):\n        out[i] = 0\n        for j in range(len(boundaries)-1):\n            if val >= boundaries[j]:\n                out[i] = j + 1\n        if val >= boundaries[-1]:\n            out[i] = len(boundaries)\n\n\ndef constraint_set(d):\n    d[\"boundaries\"] = np.abs(d[\"boundaries\"]).cumsum()\n    return d\n\n            \ndef bucketize(v: TT[\"i\"], boundaries: TT[\"j\"]) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_bucketize = make_test(\"bucketize\", bucketize, bucketize_spec,\n                           constraint=constraint_set)\n```\n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_69_0.svg)\n\n## Speed Run Mode!\nWhat is the smallest you can make each of these?\n\n```python\nimport inspect\nfns = (ones, sum, outer, diag, eye, triu, cumsum, diff, vstack, roll, flip,\n       compress, pad_to, sequence_mask, bincount, scatter_add)\n\nfor fn in fns:\n    lines = [l for l in inspect.getsource(fn).split(\"\\n\") if not l.strip().startswith(\"#\")]\n    \n    if len(lines) > 3:\n        print(fn.__name__, len(lines[2]), \"(more than 1 line)\")\n    else:\n        print(fn.__name__, len(lines[1]))\n```\n\n    ones 29\n    sum 29\n    outer 29\n    diag 29\n    eye 29\n    triu 29\n    cumsum 29\n    diff 29\n    vstack 29\n    roll 29\n    flip 29\n    compress 29\n    pad_to 29\n    sequence_mask 29\n    bincount 29\n    scatter_add 29\n\n","# 张量谜题\n- 作者：[Sasha Rush](http:\u002F\u002Frush-nlp.com) - [srush_nlp](https:\u002F\u002Ftwitter.com\u002Fsrush_nlp)（与 Marcos Treviso 合作）\n\n\n\n\n在学习像 PyTorch 或 NumPy 这样的张量编程语言时，人们很容易依赖标准库（或者更坦率地说，StackOverflow）来找到解决所有问题的“魔法函数”。但实际上，张量语言具有极强的表达能力，你可以通过基本原理和巧妙地利用广播机制来完成大多数任务。\n\n\n这是一组包含 21 个张量谜题的集合。就像国际象棋谜题一样，这些谜题并不是为了模拟真实程序的复杂性，而是为了在一个简化的环境中进行练习。每个谜题都要求你不用任何“魔法”函数，重新实现 NumPy 标准库中的一个函数。\n\n\n我建议在 Colab 中运行。点击这里并复制笔记本即可开始。\n\n[![在 Colab 中打开](https:\u002F\u002Fcolab.research.google.com\u002Fassets\u002Fcolab-badge.svg)](https:\u002F\u002Fcolab.research.google.com\u002Fgithub\u002Fsrush\u002FTensor-Puzzles\u002Fblob\u002Fmain\u002FTensor%20Puzzlers.ipynb)\n\n如果你感兴趣，还有一个关于这些谜题的 YouTube 演示视频：\n\n[![观看视频](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fsrush_Tensor-Puzzles_readme_ce62f52c040f.jpg)](https:\u002F\u002Fyoutu.be\u002FHafo7hIl8MU)\n\n```python\n!pip install -qqq torchtyping hypothesis pytest git+https:\u002F\u002Fgithub.com\u002Fdanoneata\u002Fchalk@srush-patch-1\n!wget -q https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fraw\u002Fmain\u002Flib.py\n```\n\n\n```python\nfrom lib import draw_examples, make_test, run_test\nimport torch\nimport numpy as np\nfrom torchtyping import TensorType as TT\ntensor = torch.tensor\n```\n\n## 规则\n\n1. 这些谜题围绕 *广播* 展开。请务必了解这一规则。\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fsrush_Tensor-Puzzles_readme_249c115c5ffa.png)\n\n2. 每个谜题都需要用一行代码（不超过 80 列）来解答。\n3. 你可以使用 @、算术运算、比较运算、`shape`、任何索引操作（例如 `a[:j]`, `a[:, None]`, `a[arange(10)]`），以及之前谜题中定义的函数。\n4. 你 *不允许* 使用其他任何东西。不能使用 `view`、`sum`、`take`、`squeeze`、`tensor` 等函数。\n5. 你可以从以下两个函数开始：\n\n\n```python\ndef arange(i: int):\n    \"使用此函数代替 for 循环。\"\n    return torch.tensor(range(i))\n\ndraw_examples(\"arange\", [{\"\" : arange(i)} for i in [5, 3, 9]])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_7_0.svg)\n    \n\n\n\n\n```python\n# 广播的示例。\nexamples = [(arange(4), arange(5)[:, None]) ,\n            (arange(3)[:, None], arange(2))]\ndraw_examples(\"broadcast\", [{\"a\": a, \"b\":b, \"ret\": a + b} for a, b in examples])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_8_0.svg)\n    \n\n\n\n\n```python\ndef where(q, a, b):\n    \"使用此函数代替 if 语句。\"\n    return (q * a) + (~q) * b\n\n# 在图示中，橙色表示正数\u002FTrue，零表示假\u002FFalse，蓝色表示负数。\n\nexamples = [(tensor([False]), tensor([10]), tensor([0])),\n            (tensor([False, True]), tensor([1, 1]), tensor([-10, 0])),\n            (tensor([False, True]), tensor([1]), tensor([-10, 0])),\n            (tensor([[False, True], [True, False]]), tensor([1]), tensor([-10, 0])),\n            (tensor([[False, True], [True, False]]), tensor([[0], [10]]), tensor([-10, 0])),\n           ]\ndraw_examples(\"where\", [{\"q\": q, \"a\":a, \"b\":b, \"ret\": where(q, a, b)} for q, a, b in examples])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_9_0.svg)\n    \n\n\n\n## 谜题 1 - ones\n\n计算 [ones](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.ones.html)——全为 1 的向量。\n\n\n```python\ndef ones_spec(out):\n    for i in range(len(out)):\n        out[i] = 1\n        \ndef ones(i: int) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_ones = make_test(\"one\", ones, ones_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_11_0.svg)\n    \n\n\n\n```python\n# run_test(test_ones)\n```\n\n## 谜题 2 - sum\n\n计算 [sum](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.sum.html)——向量的总和。\n\n\n```python\ndef sum_spec(a, out):\n    out[0] = 0\n    for i in range(len(a)):\n        out[0] += a[i]\n        \ndef sum(a: TT[\"i\"]) -> TT[1]:\n    raise NotImplementedError\n\n\ntest_sum = make_test(\"sum\", sum, sum_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_14_0.svg)\n    \n\n\n\n```python\n# run_test(test_sum)\n```\n\n## 谜题 3 - outer\n\n计算 [outer](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.outer.html)——两个向量的外积。\n\n\n```python\ndef outer_spec(a, b, out):\n    for i in range(len(out)):\n        for j in range(len(out[0])):\n            out[i][j] = a[i] * b[j]\n            \ndef outer(a: TT[\"i\"], b: TT[\"j\"]) -> TT[\"i\", \"j\"]:\n    raise NotImplementedError\n    \ntest_outer = make_test(\"outer\", outer, outer_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_17_0.svg)\n    \n\n\n\n```python\n# run_test(test_outer)\n```\n\n## 谜题 4 - diag\n\n计算 [diag](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.diag.html)——方阵的对角线向量。\n\n\n```python\ndef diag_spec(a, out):\n    for i in range(len(a)):\n        out[i] = a[i][i]\n        \ndef diag(a: TT[\"i\", \"i\"]) -> TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_diag = make_test(\"diag\", diag, diag_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_20_0.svg)\n    \n\n\n\n```python\n# run_test(test_diag)\n```\n\n## 谜题 5 - eye\n\n计算 [eye](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.eye.html)——单位矩阵。\n\n\n```python\ndef eye_spec(out):\n    for i in range(len(out)):\n        out[i][i] = 1\n        \ndef eye(j: int) -> TT[\"j\", \"j\"]:\n    raise NotImplementedError\n    \ntest_eye = make_test(\"eye\", eye, eye_spec, add_sizes=[\"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_23_0.svg)\n    \n\n\n\n```python\n# run_test(test_eye)\n```\n\n## 谜题 6 - triu\n\n计算 [triu](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.triu.html)——上三角矩阵。\n\n\n```python\ndef triu_spec(out):\n    for i in range(len(out)):\n        for j in range(len(out)):\n            if i \u003C= j:\n                out[i][j] = 1\n            else:\n                out[i][j] = 0\n                \ndef triu(j: int) -> TT[\"j\", \"j\"]:\n    raise NotImplementedError\n\n\ntest_triu = make_test(\"triu\", triu, triu_spec, add_sizes=[\"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_26_0.svg)\n    \n\n\n\n```python\n# run_test(test_triu)\n```\n\n## 谜题 7 - cumsum\n\n计算 [cumsum](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.cumsum.html)——累积和。\n\n\n```python\ndef cumsum_spec(a, out):\n    total = 0\n    for i in range(len(out)):\n        out[i] = total + a[i]\n        total += a[i]\n\ndef cumsum(a: TT[\"i\"]) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_cumsum = make_test(\"cumsum\", cumsum, cumsum_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_29_0.svg)\n    \n\n\n\n```python\n# run_test(test_cumsum)\n```\n\n## 谜题 8 - diff\n\n计算 [diff](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.diff.html)——滚动差分。\n\n\n```python\ndef diff_spec(a, out):\n    out[0] = a[0]\n    for i in range(1, len(out)):\n        out[i] = a[i] - a[i - 1]\n\ndef diff(a: TT[\"i\"], i: int) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_diff = make_test(\"diff\", diff, diff_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_32_0.svg)\n    \n\n\n\n```python\n# run_test(test_diff)\n```\n\n## 谜题 9 - vstack\n\n计算 [vstack](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.vstack.html)——两个向量组成的矩阵。\n\n\n```python\ndef vstack_spec(a, b, out):\n    for i in range(len(out[0])):\n        out[0][i] = a[i]\n        out[1][i] = b[i]\n\ndef vstack(a: TT[\"i\"], b: TT[\"i\"]) -> TT[2, \"i\"]:\n    raise NotImplementedError\n\n\ntest_vstack = make_test(\"vstack\", vstack, vstack_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_35_0.svg)\n    \n\n\n\n```python\n# run_test(test_vstack)\n```\n\n## 谜题 10 - roll\n\n计算 [roll](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.roll.html)——向量循环右移一位。\n\n\n```python\ndef roll_spec(a, out):\n    for i in range(len(out)):\n        if i + 1 \u003C len(out):\n            out[i] = a[i + 1]\n        else:\n            out[i] = a[i + 1 - len(out)]\n            \ndef roll(a: TT[\"i\"], i: int) -> TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_roll = make_test(\"roll\", roll, roll_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_38_0.svg)\n    \n\n\n\n```python\n# run_test(test_roll)\n```\n\n## 谜题 11 - flip\n\n计算 [flip](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.flip.html)——反转向量。\n\n\n```python\ndef flip_spec(a, out):\n    for i in range(len(out)):\n        out[i] = a[len(out) - i - 1]\n        \ndef flip(a: TT[\"i\"], i: int) -> TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_flip = make_test(\"flip\", flip, flip_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_41_0.svg)\n    \n\n\n\n```python\n# run_test(test_flip)\n```\n\n## 谜题 12 - compress\n\n计算 [compress](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.compress.html)——仅保留掩码标记的元素（左对齐）。\n\n\n```python\ndef compress_spec(g, v, out):\n    j = 0\n    for i in range(len(g)):\n        if g[i]:\n            out[j] = v[i]\n            j += 1\n            \ndef compress(g: TT[\"i\", bool], v: TT[\"i\"], i:int) -> TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_compress = make_test(\"compress\", compress, compress_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_44_0.svg)\n    \n\n\n\n```python\n# run_test(test_compress)\n```\n\n## 谜题 13 - pad_to\n\n计算 pad_to——通过删除或添加零来改变向量的大小。\n\n\n```python\ndef pad_to_spec(a, out):\n    for i in range(min(len(out), len(a))):\n        out[i] = a[i]\n\n\ndef pad_to(a: TT[\"i\"], i: int, j: int) -> TT[\"j\"]:\n    raise NotImplementedError\n\n\ntest_pad_to = make_test(\"pad_to\", pad_to, pad_to_spec, add_sizes=[\"i\", \"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_47_0.svg)\n    \n\n\n\n```python\n# run_test(test_pad_to)\n```\n\n## 谜题 14 - sequence_mask\n\n计算 [sequence_mask](https:\u002F\u002Fwww.tensorflow.org\u002Fapi_docs\u002Fpython\u002Ftf\u002Fsequence_mask)——按批次填充到指定长度。\n\n\n```python\ndef sequence_mask_spec(values, length, out):\n    for i in range(len(out)):\n        for j in range(len(out[0])):\n            if j \u003C length[i]:\n                out[i][j] = values[i][j]\n            else:\n                out[i][j] = 0\n    \ndef sequence_mask(values: TT[\"i\", \"j\"], length: TT[\"i\", int]) -> TT[\"i\", \"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_length(d):\n    d[\"length\"] = d[\"length\"] % d[\"values\"].shape[1]\n    return d\n\n\ntest_sequence = make_test(\"sequence_mask\",\n    sequence_mask, sequence_mask_spec, constraint=constraint_set_length\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_50_0.svg)\n    \n\n\n\n```python\n# run_test(test_sequence)\n```\n\n## 谜题 15 - bincount\n\n计算 [bincount](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.bincount.html)——统计每个元素出现的次数。\n\n\n```python\ndef bincount_spec(a, out):\n    for i in range(len(a)):\n        out[a[i]] += 1\n        \ndef bincount(a: TT[\"i\"], j: int) -> TT[\"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_max(d):\n    d[\"a\"] = d[\"a\"] % d[\"return\"].shape[0]\n    return d\n\n\ntest_bincount = make_test(\"bincount\",\n    bincount, bincount_spec, add_sizes=[\"j\"], constraint=constraint_set_max\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_53_0.svg)\n    \n\n\n\n```python\n# run_test(test_bincount)\n```\n\n## 谜题 16 - scatter_add\n\n计算 [scatter_add](https:\u002F\u002Fpytorch-scatter.readthedocs.io\u002Fen\u002F1.3.0\u002Ffunctions\u002Fadd.html)——将指向同一位置的值相加。\n\n\n```python\ndef scatter_add_spec(values, link, out):\n    for j in range(len(values)):\n        out[link[j]] += values[j]\n        \ndef scatter_add(values: TT[\"i\"], link: TT[\"i\"], j: int) -> TT[\"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_max(d):\n    d[\"link\"] = d[\"link\"] % d[\"return\"].shape[0]\n    return d\n\n\ntest_scatter_add = make_test(\"scatter_add\",\n    scatter_add, scatter_add_spec, add_sizes=[\"j\"], constraint=constraint_set_max\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_56_0.svg)\n    \n\n\n\n```python\n# run_test(test_scatter_add)\n```\n\n## 谜题 17 - flatten\n\n计算 [flatten](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.ndarray.flatten.html)\n\n\n```python\ndef flatten_spec(a, out):\n    k = 0\n    for i in range(len(a)):\n        for j in range(len(a[0])):\n            out[k] = a[i][j]\n            k += 1\n\ndef flatten(a: TT[\"i\", \"j\"], i:int, j:int) -> TT[\"i * j\"]:\n    raise NotImplementedError\n\ntest_flatten = make_test(\"flatten\", flatten, flatten_spec, add_sizes=[\"i\", \"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_59_0.svg)\n    \n\n\n\n```python\n# run_test(test_flatten)\n```\n\n## 谜题 18 - linspace\n\n计算 [linspace](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.linspace.html)\n\n\n```python\ndef linspace_spec(i, j, out):\n    for k in range(len(out)):\n        out[k] = float(i + (j - i) * k \u002F max(1, len(out) - 1))\n\ndef linspace(i: TT[1], j: TT[1], n: int) -> TT[\"n\", float]:\n    raise NotImplementedError\n\ntest_linspace = make_test(\"linspace\", linspace, linspace_spec, add_sizes=[\"n\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_62_0.svg)\n    \n\n\n\n```python\n# run_test(test_linspace)\n```\n\n## 谜题 19 - heaviside\n\n计算 [heaviside](https:\u002F\u002Fnumpy.org\u002Fdoc\u002Fstable\u002Freference\u002Fgenerated\u002Fnumpy.heaviside.html)\n\n\n```python\ndef heaviside_spec(a, b, out):\n    for k in range(len(out)):\n        if a[k] == 0:\n            out[k] = b[k]\n        else:\n            out[k] = int(a[k] > 0)\n\ndef heaviside(a: TT[\"i\"], b: TT[\"i\"]) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_heaviside = make_test(\"heaviside\", heaviside, heaviside_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_65_0.svg)\n    \n\n\n\n```python\n# run_test(test_heaviside)\n```\n\n## 谜题 20 - repeat (1d)\n\n计算 [repeat](https:\u002F\u002Fpytorch.org\u002Fdocs\u002Fstable\u002Fgenerated\u002Ftorch.Tensor.repeat.html)\n\n\n```python\ndef repeat_spec(a, d, out):\n    for i in range(d[0]):\n        for k in range(len(a)):\n            out[i][k] = a[k]\n\ndef constraint_set(d):\n    d[\"d\"][0] = d[\"return\"].shape[0]\n    return d\n            \ndef repeat(a: TT[\"i\"], d: TT[1]) -> TT[\"d\", \"i\"]:\n    raise NotImplementedError\n\ntest_repeat = make_test(\"repeat\", repeat, repeat_spec, constraint=constraint_set)\n```\n    \n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_68_0.svg)\n\n## 谜题 21 - bucketize\n\n计算 [bucketize](https:\u002F\u002Fpytorch.org\u002Fdocs\u002Fstable\u002Fgenerated\u002Ftorch.bucketize.html)\n\n```python\ndef bucketize_spec(v, boundaries, out):\n    for i, val in enumerate(v):\n        out[i] = 0\n        for j in range(len(boundaries)-1):\n            if val >= boundaries[j]:\n                out[i] = j + 1\n        if val >= boundaries[-1]:\n            out[i] = len(boundaries)\n\n\ndef constraint_set(d):\n    d[\"boundaries\"] = np.abs(d[\"boundaries\"]).cumsum()\n    return d\n            \ndef bucketize(v: TT[\"i\"], boundaries: TT[\"j\"]) -> TT[\"i\"]:\n    raise NotImplementedError\n\ntest_bucketize = make_test(\"bucketize\", bucketize, bucketize_spec,\n                           constraint=constraint_set)\n```\n![svg](Tensor%20Puzzlers_files\u002FTensor%20Puzzlers_69_0.svg)\n\n## 快速通关模式!\n你能把每一个函数都做得多小呢？\n\n```python\nimport inspect\nfns = (ones, sum, outer, diag, eye, triu, cumsum, diff, vstack, roll, flip,\n       compress, pad_to, sequence_mask, bincount, scatter_add)\n\nfor fn in fns:\n    lines = [l for l in inspect.getsource(fn).split(\"\\n\") if not l.strip().startswith(\"#\")]\n    \n    if len(lines) > 3:\n        print(fn.__name__, len(lines[2]), \"(超过1行)\")\n    else:\n        print(fn.__name__, len(lines[1]))\n```\n\n    ones 29\n    sum 29\n    outer 29\n    diag 29\n    eye 29\n    triu 29\n    cumsum 29\n    diff 29\n    vstack 29\n    roll 29\n    flip 29\n    compress 29\n    pad_to 29\n    sequence_mask 29\n    bincount 29\n    scatter_add 29","# Tensor-Puzzles 快速上手指南\n\nTensor-Puzzles 是一套由 Sasha Rush 开发的交互式编程练习，旨在帮助开发者深入理解 PyTorch 和 NumPy 中的**广播机制（Broadcasting）**。通过 21 个精心设计的谜题，你将学会在不依赖高级库函数（如 `sum`, `view`, `squeeze` 等）的情况下，仅利用基础运算、索引和广播规则来重构常见的张量操作。\n\n## 环境准备\n\n*   **运行平台**：推荐使用 **Google Colab**（无需本地配置，开箱即用）。\n*   **本地环境**（可选）：\n    *   Python 3.8+\n    *   PyTorch\n    *   NumPy\n    *   额外依赖：`torchtyping`, `hypothesis`, `pytest`, `chalk`\n\n## 安装步骤\n\n### 方案一：使用 Google Colab（推荐）\n点击以下按钮直接在浏览器中打开并复制笔记本，即可开始练习：\n\n[![Open In Colab](https:\u002F\u002Fcolab.research.google.com\u002Fassets\u002Fcolab-badge.svg)](https:\u002F\u002Fcolab.research.google.com\u002Fgithub\u002Fsrush\u002FTensor-Puzzles\u002Fblob\u002Fmain\u002FTensor%20Puzzlers.ipynb)\n\n### 方案二：本地安装\n如果你希望在本地运行，请先克隆项目或下载核心文件，然后执行以下命令安装依赖：\n\n```bash\n!pip install -qqq torchtyping hypothesis pytest git+https:\u002F\u002Fgithub.com\u002Fdanoneata\u002Fchalk@srush-patch-1\n!wget -q https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fraw\u002Fmain\u002Flib.py\n```\n*(注：国内用户若下载缓慢，可尝试手动下载 `lib.py` 文件至当前目录，或使用国内 pip 镜像源安装其他依赖)*\n\n## 基本使用\n\n### 1. 导入环境\n在 Notebook 单元格中运行以下代码以加载工具库和基础函数：\n\n```python\nfrom lib import draw_examples, make_test, run_test\nimport torch\nimport numpy as np\nfrom torchtyping import TensorType as TT\ntensor = torch.tensor\n```\n\n### 2. 核心规则\n在开始解题前，请牢记以下限制，这是本项目的核心训练目标：\n1.  **核心机制**：所有谜题均围绕**广播（Broadcasting）**展开。\n2.  **代码限制**：每个谜题必须在 **1 行代码**（少于 80 列）内完成。\n3.  **允许操作**：矩阵乘法 (`@`)、算术运算、比较运算、`.shape`、任意索引（如 `a[:j]`, `a[:, None]`, `a[arange(10)]`）以及已完成的谜题函数。\n4.  **禁止操作**：严禁使用 `view`, `sum`, `take`, `squeeze`, `tensor` 等“魔法”函数。\n\n### 3. 解题示例\n每个谜题都提供了规格说明函数（`_spec`，模拟循环逻辑）和你需要实现的函数。\n\n**示例：Puzzle 1 - ones**\n目标：创建一个全为 1 的向量，不能使用 `torch.ones`。\n\n```python\n# 题目定义\ndef ones_spec(out):\n    for i in range(len(out)):\n        out[i] = 1\n        \ndef ones(i: int) -> TT[\"i\"]:\n    raise NotImplementedError  # 在此处填写你的一行代码\n\n# 生成测试用例\ntest_ones = make_test(\"one\", ones, ones_spec, add_sizes=[\"i\"])\n\n# 运行测试验证答案\nrun_test(test_ones)\n```\n\n**解题思路提示**：\n利用提供的辅助函数 `arange` 和广播机制。例如，可以通过让一个全 1 的标量与任意形状的张量进行广播运算，或者利用布尔值转换来实现。\n\n### 4. 进阶辅助函数\n项目中预定义了两个关键辅助函数，用于替代循环和条件判断：\n\n*   **arange**: 替代 `for` 循环生成序列。\n    ```python\n    def arange(i: int):\n        return torch.tensor(range(i))\n    ```\n*   **where**: 替代 `if-else` 逻辑。\n    ```python\n    def where(q, a, b):\n        return (q * a) + (~q) * b\n    ```\n\n### 5. 开始挑战\n依次完成从 `Puzzle 1` 到 `Puzzle 21` 的代码填空，每完成一个取消注释 `run_test(...)` 即可验证正确性。如需可视化参考，可观看作者的 [YouTube 讲解视频](https:\u002F\u002Fyoutu.be\u002FHafo7hIl8MU)。","一位刚入门深度学习的研究员在尝试复现论文中的复杂张量操作时，发现自己过度依赖 `for` 循环和现成的库函数，导致代码运行缓慢且难以理解底层的广播机制。\n\n### 没有 Tensor-Puzzles 时\n- **思维固化**：遇到多维数组操作习惯性编写低效的 Python `for` 循环，无法利用 GPU 并行加速。\n- **盲目复制**：过度依赖 StackOverflow 寻找“魔法函数”，一旦报错便不知如何从原理层面调试。\n- **广播困惑**：对 PyTorch 的广播规则（Broadcasting）一知半解，经常因维度不匹配引发难以追踪的形状错误。\n- **代码冗余**：实现简单的逻辑（如条件筛选或求和）需要多行冗长代码，缺乏向量化思维的简洁性。\n\n### 使用 Tensor-Puzzles 后\n- **掌握核心**：通过 21 个限时谜题，强制在单行代码内利用广播机制解决问题，彻底摆脱了对循环的依赖。\n- **原理内化**：在禁止使用 `sum`、`view` 等高级函数的限制下，学会了用基础算术和索引重构标准库功能，真正理解算子本质。\n- **调试自信**：能够预判张量形状的变化，快速定位维度对齐问题，不再被晦涩的形状报错劝退。\n- **代码精简**：养成了用一行向量化代码替代多行逻辑的习惯，显著提升了模型前向传播部分的执行效率。\n\nTensor-Puzzles 通过高强度的专项训练，帮助开发者从“调用 API\"进阶为“精通张量语言”，从根本上提升了编写高效深度学习代码的能力。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fsrush_Tensor-Puzzles_249c115c.png","srush","Sasha Rush","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fsrush_0d88b2d1.jpg","Cornell Tech \u002F Hugging Face","Cornell","New York","srush.research@gmail.com","srush_nlp","http:\u002F\u002Frush-nlp.com","https:\u002F\u002Fgithub.com\u002Fsrush",[84,88],{"name":85,"color":86,"percentage":87},"Jupyter Notebook","#DA5B0B",98.9,{"name":89,"color":90,"percentage":91},"Python","#3572A5",1.1,4014,363,"2026-04-09T00:02:37","MIT",1,"未说明","非必需",{"notes":100,"python":97,"dependencies":101},"该工具主要设计为在 Google Colab 环境中运行。核心依赖 PyTorch 和 NumPy 进行张量编程练习。安装时需要通过 pip 安装特定版本的 chalk 库（从 GitHub 分支安装）。谜题规则严格限制只能使用广播、算术运算、比较、形状检查和索引操作，禁止使用 view、sum 等高级封装函数。",[102,103,104,105,106,107],"torch","numpy","torchtyping","hypothesis","pytest","chalk",[14],[110,111,102],"machine-learning","puzzle",null,"2026-03-27T02:49:30.150509","2026-04-09T12:33:44.441569",[116,121,126,131,136,141,146,151],{"id":117,"question_zh":118,"answer_zh":119,"source_url":120},26277,"在哪里可以找到这些谜题的示例解答或提示视频？","维护者制作了一个视频，展示了每个谜题的解决方案。您可以访问以下链接观看：https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=SiwTAyyvt5s","https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fissues\u002F12",{"id":122,"question_zh":123,"answer_zh":124,"source_url":125},26278,"在解题时允许使用 `.bool()` 或 `.long()` 进行类型转换吗？","是的，允许使用 `.bool()` 或 `.long()` 来创建掩码或进行类型转换。这是被认可的操作方式。","https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fissues\u002F30",{"id":127,"question_zh":128,"answer_zh":129,"source_url":130},26279,"如何解决 Puzzle 10 (roll)？有没有不用构建完整置换矩阵的方法？","有两种方法：一种是构建置换矩阵；另一种更简便的方法是使用高级索引（advanced indexing）。利用 `arr[ind_arr]` 的特性，即使 `ind_arr` 是一个张量也能正常工作，从而避免手动构建完整的置换矩阵。","https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fissues\u002F21",{"id":132,"question_zh":133,"answer_zh":134,"source_url":135},26280,"安装 chalk diagram 工具时遇到 `metadata-generation-failed` 错误怎么办？","这是由于新版 setuptools 导致的兼容性问题。解决方法是在安装命令之前先强制安装旧版本的 setuptools。请运行：`!pip install setuptools==57.5.0`，然后再尝试安装 chalk diagram。","https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fissues\u002F19",{"id":137,"question_zh":138,"answer_zh":139,"source_url":140},26281,"Puzzle 2 (sum)、Puzzle 7 (cumsum) 和 Puzzle 15 (bincount) 有什么解题思路提示？","对于 Puzzle 2 和 7，建议尝试构造一个特殊的向量或矩阵，使得通过矩阵乘法即可计算出所需的输出值。对于 Puzzle 15 (bincount)，建议思考如何使用独热向量（one-hot vectors）来实现计数功能。","https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fissues\u002F7",{"id":142,"question_zh":143,"answer_zh":144,"source_url":145},26282,"为什么 Puzzle 18 在张量看起来相等时仍然抛出断言错误？","这是一个测试框架的问题。其他谜题涉及整数，所以使用 `torch.equal` 没问题；但 Puzzle 18 涉及浮点数，应该使用 `.almost_equal` 进行比较。如果您的答案逻辑正确，可以忽略此错误，维护者已修复该测试问题。","https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fissues\u002F8",{"id":147,"question_zh":148,"answer_zh":149,"source_url":150},26283,"Puzzle 8 (diff) 函数定义中的第二个整数参数 `i` 是做什么用的？","第二个参数其实不是必须的。它被包含在函数签名中主要是为了让使用者在代码高尔夫（code golf）模式下节省字符数，因为可以直接使用该参数而无需调用 `shape` 操作来获取长度。","https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fissues\u002F13",{"id":152,"question_zh":153,"answer_zh":154,"source_url":155},26284,"在 Python 3.9 上运行时出现 `KeyError: 'return'` 错误如何解决？","这是由于 Python 3.9 中 `typing.get_type_hints` 的行为变化导致的。维护者已经修复了这个问题，请重新拉取最新代码或重新加载环境即可解决。","https:\u002F\u002Fgithub.com\u002Fsrush\u002FTensor-Puzzles\u002Fissues\u002F1",[]]