NumPy随机函数与广播机制:维度对齐、代码实战与踩坑全解
【day 48】随机函数与广播机制打卡到这个组合的时候我明显感觉身边不少同学开始卡壳了随机函数单独用没问题广播规则单独看也能理解但真到写代码的时候要么随机生成的数组形状对不上要么广播维度绕不明白一个 ValueError 直接把人打懵。今天这篇文章就想把这两块一并讲透从函数选型到广播边界再到两者结合的实操场景和排查技巧全程用可以直接抄跑的代码说话。适合正在啃数据科学、深度学习尤其是刚接触向量化编程的开发者收藏。1. 随机函数不是“掷骰子”那么简单先搞懂你到底在用什么1.1 先分清楚高频随机函数到底生成什么分布很多人写随机数全凭肌肉记忆今天用np.random.rand()明天用np.random.randn()后天又换np.random.normal()但问一句“这几个分布有什么区别”能立刻答上来的人并不多。我先把高频函数按分布类型整理一下。函数生成内容分布类型典型shape参数np.random.rand(d0, d1, ...)浮点数均匀分布 [0, 1)shape直接作为参数np.random.randn(d0, d1, ...)浮点数标准正态分布shape直接作为参数np.random.randint(low, high, size)整数离散均匀分布size指定shapenp.random.random(size)浮点数均匀分布 [0, 1)size元组指定shapenp.random.uniform(low, high, size)浮点数区间均匀分布size指定shapenp.random.normal(loc, scale, size)浮点数正态分布size指定shapenp.random.choice(a, size, replace)从数组中采样按数组分布size指定个数np.random.permutation(n)打乱的索引数组无放回排列n为长度重点说一下最容易混淆的rand()和randn()。rand()生成的是 0 到 1 之间的均匀分布随机数适合模拟“等概率”场景比如随机初始化一个小范围的权重或者给数据加 0~1 之间的缩放系数。randn()生成的是标准正态分布均值 0、方差 1取值范围没有上限理论上可以出现 3.5、-2.8 这种“看起来有点大”的数字。举个数感例子np.random.randn(5)一次运行可能得到[0.49, -1.27, 0.36, -0.68, 1.96]而np.random.rand(5)一次运行更接近[0.76, 0.22, 0.91, 0.47, 0.83]。前者会出现负数和超过 1 的值后者严格落在 [0, 1) 区间。这个区别直接影响后续代码逻辑比如做概率判断、生成遮罩时用rand做参数扰动、初始化权重时用randn居多。1.2 从需求反推选型什么时候用正态什么时候用均匀选随机函数不应该靠记而应该靠“你这个业务场景需要什么数学性质”。我试过不少项目总结下来就三个判断维度。第一看取值范围有没有要求。如果必须限制在某个区间内直接选均匀分布或者自定义区间。np.random.uniform(-0.05, 0.05, size(3, 4))可以保证所有权重在 ±0.05 之间。如果只是希望“大多数值集中在小数值附近偶尔有离群值”选正态分布更合理。深度学习权重初始化为什么常用np.random.randn乘一个小系数而不是直接用np.random.rand就是因为rand的均值是 0.5直接作为权重初始值会让所有神经元输出偏向某个同方向而randn的均值是 0正负对称更适合线性层的前向传播。第二看是否需要整数。需要整数的场景比如随机选 batch 索引、生成离散动作、模拟掷骰子一律用randint或choice。这里有个坑很多人想生成 [0, 1) 的整数随机数写了np.random.randint(0, 1)结果永远是 0因为randint是左闭右开区间永远取不到 1。想生成 0 和 1应该写np.random.randint(0, 2)。第三看是否需要可复现。如果你做实验、调参、跑基线必须在代码开头设置随机种子。np.random.seed(42)之后每次执行np.random.randn(3)得到的序列完全一致。这个特性不是让你“消灭随机性”而是让实验过程可复现别人拿到你的代码能跑出相同的结果。注意种子设置一次管一次会话单线程下生效最稳定多线程或分布式环境下要另做控制。1.3 随机种子不是“固定答案”而是“序列起点”关于随机种子我踩过一个很典型的坑在循环里反复设置同一个 seed以为这样每次结果一样结果发现完全不一样。原因很简单同样一个 seed 只能保证“从该 seed 之后生成的第一批序列”一致如果你在循环开始前设置一次 seed然后循环里不断调用随机函数第二次循环已经用了之前序列的尾部自然对不上。正确做法是固定种子放在程序最前面后续所有随机操作都基于这个种子生成的线性同余序列继续推进。如果你需要多个独立实验每轮实验用一个不同的种子比如np.random.seed(epoch)或者传入一个基础种子加偏移量。记住一句话seed 是序列的起点不是结果的固定器。2. 广播机制NumPy 真正好用的底层逻辑2.1 广播的本质尺寸不匹配时数组在背后偷偷做了什么广播机制简单说就是两个数组做运算时shape 不一致但不是直接报错而是尝试把维度“对齐扩展”让它们能逐元素运算。这个机制节省了大量显式for循环也避免了你手动写复制逻辑。核心规则只有三条从右往左对齐维度两个维度相等直接对应两个维度不相等其中一个是 1那就扩展这个 1 去匹配另一个如果两个都不为 1 且不相等就报错。这个规则听起来抽象我用一个生活类比解释你和朋友各有一排座位你要跟每一个人握手。你只有一个人朋友有 5 个人这会自动理解为“你站在第一个人面前依次跟后面的人握手”而不是“你凭空复制成 5 个人”。广播就是“不复制数据、假装扩展”的机制真正算的时候按需搬运数据。2.2 三个广播实例标量、向量和矩阵如何自动对齐我直接给三个典型场景你跑一遍就有感觉了。第一个是标量与数组的广播。arr np.array([1, 2, 3])执行arr 10结果是[11, 12, 13]。这里 10 被“广播”到长度 3跟 arr 的每个元素相加。这个最简单但也是很多复杂规则的基石。第二个是 row 与 column 的广播。a np.array([[1], [2], [3]])的 shape 是(3, 1)b np.array([10, 20, 30])的 shape 是(3,)。直接a b会得到一个 shape 为(3, 3)的矩阵每一行都把a的列值跟b的三个元素相加。这里a的(3,1)在列维度广播b的(3,)自动视为(1,3)再在行维度广播。输出结果是每个位置都是对应行列的叠加非常好用。第三个是多维数组的混合广播。比如x np.random.rand(4, 5)你想对每个样本的每个特征减去该样本第 0 个特征的值或者减去全局平均值。只要保证被减数组的 shape 能对齐(4, 5)就可以一行代码完成。x - x.mean(axis0)会把均值数组(5,)广播到每一行x - x.mean(axis1, keepdimsTrue)会把均值数组(4,1)广播到每一列。注意keepdims这个参数很多新手忘记它导致mean的结果丢了维度广播报错。2.3 广播边界与内存真相为什么它快又为什么它会报错广播之所以快本质是因为内存里并没有真的把数据复制成两份而是通过“虚拟视图”的方式按 index 映射到原数据。这一点在写大数组计算时尤为重要避免np.repeat或np.tile过度使用。但也有代价当广播后的逻辑 shape 太大时中间结果可能会占大量内存。比如一个(10000, 1)和一个(1, 10000)相加结果是一个(10000, 10000)的浮点矩阵大约 800 MB。你虽然没有显式复制数据但输出本身就得这么大内存照样会爆。广播报错是另一个困扰点。最经典的错误是ValueError: operands could not be broadcast together with shapes (3,) (4,)。两个数组从右往左对齐到最后一个维度3 和 4 不相等且没有哪一个为 1所以无法广播。解决办法通常是reshape或newaxis让其中一个维度变成 1比如a[:, np.newaxis] b。3. 随机 广播组合实战从参数初始化到批量计算3.1 权重初始化随机函数负责“生成数值”广播负责“排布”写一个最简单的两层全连接前向传播就能把随机函数和广播机制串起来。假设输入层维度 4输出层维度 3batch size 为 8。import numpy as np np.random.seed(0) # 输入8 个样本每个样本 4 个特征 x np.random.randn(8, 4) # 权重输出维度 3输入维度 4 w np.random.randn(3, 4) * 0.01 # 偏置每个输出神经元一个偏置 b np.zeros((3, 1)) # 线性层z x w.T b z x w.T b.T print(z.shape) # (8, 3)这里有个非常容易出错的点w的 shape 是(3, 4)x的 shape 是(8, 4)两者不能直接矩阵乘因为第二个维度不匹配。所以我用了x w.T得到(8, 3)。此时b初始为(3, 1)如果直接x w.T b广播规则会把(3,1)对齐到(8,3)每一行都加同一组偏置这完全正确。但如果你把b定义成(1, 3)或者(3,)加出来效果也一样。这就是广播的价值偏置向量的 shape 不要求严格等于主矩阵的 shape只要能对齐就可以。再说权重初始化。很多教材喜欢直接np.random.randn(3, 4) * 0.01这个0.01就是控制初始参数幅度。为什么不用np.random.rand(3, 4)正如前面说的rand生成 0~1 均匀分布均值 0.5会让初始的 z 偏向正值randn生成正负对称配合小系数能让初始反向传播更平稳。实操里你还可以用更精细的 Xavier 或 He 初始化核心就是根据输入输出维度调整随机分布的方差但归根到底随机函数的选型决定了参数分布形态。3.2 数据增强与批量噪声一行代码给整批数据加扰动随机函数和广播组合最直观的场景是给数据加噪声。假设你有一个数据集datashape 为(100, 5)也就是 100 个样本每个样本 5 个特征。# 方式一给每个特征加固定幅度的噪声 feature_noise np.random.normal(0, 0.02, size(1, 5)) data_aug data feature_noise # 方式二给每个样本加一个样本级扰动所有特征共用一个缩放 scaling np.random.uniform(0.9, 1.1, size(100, 1)) data_scale data * scaling第一种方式里feature_noise是(1,5)广播到(100,5)后第 i 列的每个样本都减去/加上同一个噪声值相当于给整个特征维度加一个全局偏移。第二种方式里scaling是(100,1)广播到(100,5)后每一行的 5 个特征都乘以同一个随机缩放因子相当于模拟样本整体大小变化。这两种语义完全不同你必须清楚地知道自己要哪种否则特征间的相关性会被无意破坏。实际做数据增强时我建议先打印一次广播前的 shape 和广播后的 shape确认你想要的“语义”符合预期。一个常见错误是直接data np.random.randn(100, 5)这样每个元素都加独立噪声可能并不是你想要的尤其在特征之间存在固定关联时独立噪声会直接抹掉特征间模式。3.3 Mini-batch 归一化随机采样和广播的配合小批量训练几乎每步都用随机函数和广播。写一个通用的 mini-batch 采样和归一化片段def get_batch(data, label, batch_size, seed): rng np.random.default_rng(seed) idx rng.permutation(len(data))[:batch_size] return data[idx], label[idx] # 使用 batch_x, batch_y get_batch(x_train, y_train, 32, seed42) mean batch_x.mean(axis0, keepdimsTrue) # (1, d) std batch_x.std(axis0, keepdimsTrue) # (1, d) batch_x_norm (batch_x - mean) / (std 1e-8)这段代码完美展示了两件事rng.permutation生成随机索引完成无放回采样keepdimsTrue保留了维度让mean和std可以直接和batch_x广播。如果去掉keepdimsbatch_x.mean(axis0)的结果是(d,)跟batch_x的(batch, d)做减法虽然也能广播但语义上其实是“每行都减去同一个一维数组”。两种写法结果一样但keepdims让代码更明确也避免了某些更复杂场景下隐式广播造成的维度混淆。4. 踩坑实录随机种子、维度对齐和广播陷阱4.1 必报错误operands could not be broadcast together 的三种解法遇到ValueError: operands could not be broadcast together先不用慌这是广播规则里最常见的问题。我给出三种排查思路。第一种打印两个数组的 shape确认问题出现在哪个轴。比如 A 是(3,)B 是(4,)一眼看出最后一位 3 对 4不兼容。直接改成A[:, np.newaxis] B把 A 变成(3,1)就能得到(3,4)的输出。第二种检查是否在运算前丢了维度。很多人计算np.mean(arr, axis1)后直接拿去和原数组相减因为均值结果少了一维报错。解决办法就是keepdimsTrue或者reshape回来。第三种检查你错误的轴。矩阵乘的维度规则跟广播完全不同很多人分不清(3,4)和(4,3)能不能直接乘。矩阵乘看的是“内部维度一致”广播看的是“从右往左能对齐”。出现奇怪报错时先明确你是在做逐元素运算还是矩阵乘法。4.2 随机种子失效的瞬间复现实验时别踩的坑随机种子看起来简单实际项目中我见过很多人卡住。一个典型踩坑是在函数内部设置了np.random.seed(42)然后反复调用这个函数期望每次生成一样的随机数。结果并不是每次一样因为当你的脚本还调用了别的随机库、或者使用了default_rng混合状态时全局种子和局部种子之间会互相干扰。我的建议是统一使用np.random.default_rng(seed)创建一个独立的随机状态对象再把这个对象传给你的函数。这样每个函数有自己的随机序列互不污染。比如rng np.random.default_rng(42) a rng.normal(size3) b rng.normal(size3)default_rng是新版推荐写法生成的序列和旧版np.random.seed并不一致如果你从老代码迁移过来注意复现结果的基准会变化。另外一个跟随机种子相关的坑是并行和 batch 采样如果在多进程里每个进程都开同一个 seed每个进程拿到的数据完全一样这往往不是你想要的。正确做法是用一个全局种子然后根据进程号做偏移比如np.random.default_rng(global_seed rank)。4.3 打乱数据时标签错位索引重排的正确姿势训练模型前要打乱数据很多人会这样写np.random.shuffle(x) np.random.shuffle(y)这样百分百错位。shuffle是就地打乱两次打乱的顺序完全不同x和y的对应关系彻底丢失。正确做法是先生成打乱的索引再同时索引两个数组idx np.random.permutation(len(x)) x_shuffled x[idx] y_shuffled y[idx]这里的核心思想是“共享同一个随机序列”。permutation生成一组乱序索引x[idx]和y[idx]都按同一套索引重排对应关系必然保持。顺着这个思路mini-batch 采样、交叉验证切分、数据增强配对标签全都可以用这个模式。4.4 广播结果是视图还是副本内存隐患排查广播本身不复制输入数据但 ufunc 的输出通常是一个新数组。这里有个容易混淆的点你用切片或newaxis得到的索引结果可能是原数组的视图修改它可能影响原数组但广播运算的返回值一般是新数组修改它不会影响原数组。我遇到过一种内存隐患把一个大数组通过广播扩大了很多倍还赋值给了一个变量留着后续用结果导致内存直接吃满。广播快是快但最终结果占用的内存和扩展后的 shape 成正比。比如你有一个(1000000, 1)的向量跟一个(1, 50)的向量相加输出是(1000000, 50)的矩阵大约是 400 MB。如果你只是想做逐行聚合完全可以改用(1000000, 50)按轴操作或者用更省内存的迭代策略。调试技巧出现内存增长或者莫名报错时先用arr.shape、arr.dtype、arr.nbytes快速定位。nbytes可以帮你算出数组占了多少字节判断是不是广播扩大导致。5. 再给一个组合练习用随机函数和广播模拟一个投掷实验理论讲了这么多我建议你亲手做一个模拟实验把随机函数和广播结合起来。场景模拟 10000 次投掷两颗骰子统计点数之和的分布。import numpy as np np.random.seed(7) n 10000 # 生成两个骰子的点数矩阵shape 均为 (n, 1) dice1 np.random.randint(1, 7, size(n, 1)) dice2 np.random.randint(1, 7, size(n, 1)) # 广播相加结果 shape (n, 1) sum_ dice1 dice2 # 统计点数 2~12 的频率 values, counts np.unique(sum_, return_countsTrue) for v, c in zip(values, counts): print(f点数 {v}: 概率 {c / n:.4f})这个例子里dice1和dice2都是(n, 1)相加时广播规则让它们逐元素相加根本不需要循环。np.unique再统计频率一次跑完。你可以试着把dice1改成(n,)看看和dice2相加后的 shape 变化理解维度为 1 和维度缺失之间的区别(n,)被视为(1,n)和(n,1)相加会得到(n,n)矩阵语义完全不同。这种组合练习我建议每个刚学广播的人做一遍做完了你对广播的“对齐直觉”会好很多。6. 把随机函数和广播机制放进日常训练习惯里写到最后分享一个我自己实际操作中的习惯写任何涉及多维数组的代码第一行先打印.shape第二行再想这个操作到底落在哪个轴上。随机函数选型也同理先问自己要什么分布、需不需要整数、要不要可复现再去写代码。这样组合起来能避免大部分无意义报错。另外一个小技巧调试广播问题时可以把两边的 shape 写在一张草稿纸上从右往左逐位对齐遇到 1 就画个箭头标记扩展方向。这个方法帮我在处理三维四维数组时节省了大量时间尤其是处理(batch, seq_len, feature)这种序列数据时哪一维需要保持、哪一维需要广播一目了然。随机函数和广播机制本质上是在说同一件事如何用简洁的向量化操作把随机性注入到批量计算中。回到 day 48 这个节点如果之前的打卡内容已经在讲 NumPy 的切片和聚合那继续吃透这两个点就能让代码从“能跑”进化到“高效、清晰、可复现”。后面再学数据加载、模型训练你会经常遇到它们第一次就把底层逻辑搞清楚后面就都是一马平川了。

相关新闻

MTCNN人脸检测详解:P-Net、R-Net、O-Net三级网络训练与部署实战

MTCNN人脸检测详解:P-Net、R-Net、O-Net三级网络训练与部署实战

简介:面向深度学习和计算机视觉研究者,这份完整代码基于MTCNN级联卷积网络实现人脸检测,清晰覆盖P-Net候选框提议、R-Net边界框精修、O-Net关键点定位的完整流程。包体共80个文件,以Python源码为核心,包含48个py文件&a…

2026/10/12 7:08:08 阅读更多 →
物联网通信技术选型与架构设计:从链路预算到协议栈的工程实践指南

物联网通信技术选型与架构设计:从链路预算到协议栈的工程实践指南

干了十几年通信,最明显的感觉是:打电话的人越来越少,问"能不能帮我把这个箱子里的定位数据传回来"的人越来越多。物联网这个概念被炒了很多年,别人看到的是智能家居、智慧城市、大风口,我看到的是另一件事—…

2026/10/12 7:08:08 阅读更多 →
MyBatis查询功能全解析:从动态SQL到性能优化的实战指南

MyBatis查询功能全解析:从动态SQL到性能优化的实战指南

项目标题: MyBatis各种查询功能用到一定年头你就会发现,MyBatis的查询功能说难不难,说简单也绝不是写个select标签就完事。日常开发里,动态条件、分页、多表嵌套、批量操作,任何一个场景都能写出好几种不同写法,而每种…

2026/10/12 7:08:08 阅读更多 →

最新新闻

gRPC从入门到实战:跨语言微服务通信与Python并发避坑指南

gRPC从入门到实战:跨语言微服务通信与Python并发避坑指南

我真的是太爱学习了——这种念头冒出来的时候,通常不是因为刚学会了一个妙招,而是因为刚被一个不算难的框架折腾到凌晨一点。最近这个对象就是 gRPC。很长一段时间里,我提到 gRPC 都是能躲就躲:要写 .proto、要装 protoc、跨语言还…

2026/10/12 8:44:35 阅读更多 →
从人耳到算法:MFCC梅尔倒谱系数原理与实战调参指南

从人耳到算法:MFCC梅尔倒谱系数原理与实战调参指南

1. 从人耳到算法:为什么需要梅尔倒谱系数做语音相关项目的人,迟早会撞上MFCC这个词。不管你是做语音识别、声纹比对、情感计算,还是只是想做个简单的关键词唤醒,翻开源码或者论文,MFCC几乎无处不在。但很多人第一次看到…

2026/10/12 8:44:35 阅读更多 →
2025制造业AI落地实战:视觉质检、预测性维护与排程优化

2025制造业AI落地实战:视觉质检、预测性维护与排程优化

1. 制造业AI落地的真实图景:从概念狂欢到车间实战2025年过半,我跑了十几个城市的制造企业,从年产值几十亿的汽车零部件龙头到只有百来号人的精密加工厂,聊下来最大的感受是:制造业对AI的态度已经彻底变了。前两年大家还…

2026/10/12 8:44:35 阅读更多 →
3个爆火Claude Code工具深度解析:TaoToken统一Key下如何选对赛道

3个爆火Claude Code工具深度解析:TaoToken统一Key下如何选对赛道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 8:44:35 阅读更多 →
一站式接入Kimi K3:OpenAI协议兼容的零改造迁移方案

一站式接入Kimi K3:OpenAI协议兼容的零改造迁移方案

1. 项目概述:为什么“一站式接入Kimi K3”突然成了刚需?最近两周,我陆续收到七八位不同背景的朋友咨询——有做教育类SaaS产品的技术负责人,有独立开发AI助教工具的自由开发者,还有某高校实验室带学生做对话系统课题的…

2026/10/12 8:44:35 阅读更多 →
OpenAI DevDay 2026:dots、Spaces与GPT-6.1 Sol的工程化落地指南

OpenAI DevDay 2026:dots、Spaces与GPT-6.1 Sol的工程化落地指南

1. 这不是发布会速记,而是一份开发者视角的“技术落地可行性评估报告”OpenAI DevDay 2026 这个标题本身已经释放出强烈的信号:它不再是一场面向大众的炫技秀,而是一次明确指向工程实践边界的深度技术校准。我全程参与了线上直播与会后48小时…

2026/10/12 8:43:30 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →