NumPy与PyTorch张量类型转换避坑指南:从dtype差异到完整链路
最近在做图像分割的练手项目时又遇到一个让我怀疑人生的报错RuntimeError: Expected object of scalar type Float but got scalar type Double for argument #2 mat2。第一反应是模型结构写错了检查了半天才发现问题出在输入数据——我用 numpy 读了一张图转成 tensor 后喂给网络结果这个看似平平无奇的类型转换硬生生卡住了整个训练流程。想来也有意思numpy array和pytorch tensor的互转几乎是每个做深度学习的人每天都要碰的操作但关于里面的 dtype 体系差异、内存共享语义、设备上下文限制大多数人只是记住了大概这么写真遇到问题就毫无头绪。这篇文章就把我踩过的坑、梳理过的原理、最终沉淀下来的转换套路完整写一遍从 dtype 映射到 API 选择再到完整训练链路里的转换写法希望你看完能少走弯路。1. 先别急着调 APInumpy 和 torch 的 dtype 体系差异太大很多人在 numpy 和 tensor 之间转换时脑子里只有np.array() / torch.tensor() / .numpy()这几个函数名却忽略了一个前提这两个库各自维护了一套完整的 dtype 体系。名字看似差不多但默认值、取值范围、精度语义完全不同。最典型的一个坑就是默认浮点类型。你在 numpy 里随手写np.array([1.0, 2.0, 3.0])得到的是float64但你在 PyTorch 里写torch.tensor([1.0, 2.0, 3.0])默认却是float32。一个 64 位一个 32 位这俩在深度学习的场景里根本不是差不多而是一个能用、一个直接报错的关系。原因要从设计目标说起。numpy 是通用的数值计算库它追求的是数值精度和通用性所以浮点默认用float64双精度而 PyTorch 是面向深度学习训练框架设计的其绝大多数模型参数、中间激活值都是单精度float32为了性能和显存占用默认浮点类型就是float32。如果模型参数是float32你硬塞进去一个float64的输入 tensorPyTorch 在矩阵乘法、卷积等算子内部就会因为类型不匹配直接抛出Expected scalar type Float but got scalar type Double这样的报错行号还不一定指向数据准备代码排查起来非常折磨人。为了彻底搞清楚类型对应关系我把常用的 dtype 映射整理成了下面这张表建议你收藏起来语义numpy dtypepytorch dtypetorch 简写别名单精度浮点float32torch.float32torch.float双精度浮点float64torch.float64torch.double半精度浮点float16torch.float16torch.half有符号 8 位整数int8torch.int8无有符号 16 位整数int16torch.int16torch.short有符号 32 位整数int32torch.int32torch.int有符号 64 位整数int64torch.int64torch.long无符号 8 位整数uint8torch.uint8无布尔booltorch.bool无复数 64complex64torch.complex64无复数 128complex128torch.complex128无看这张表你还会发现一些微妙的地方。比如整数类型numpy 和 torch 都覆盖了int8/int16/int32/int64这个完整序列但uint16/uint32/uint64在 PyTorch 里是没有对应类型的uint8倒是常用主要用于图像像素存储。再说bfloat16这是 PyTorch 混合精度训练里非常重要的类型numpy 却根本不支持。所以当你用 AMP 做了半精度训练想把输出转成 numpy 数组保存结果时不能直接转得先提升到float32这一点后面我会专门展开。先记住一个结论跨框架转换时dtype 默认值不一致是最大隐患明确指定 dtype 永远比依赖默认行为更安全。2. numpy 转 tensor三个 API 藏着三种不同内存语义从 numpy 转到 torch tensor最常用的写法就有三种torch.tensor(arr)、torch.from_numpy(arr)、torch.as_tensor(arr)。很多初学者以为这三者可以随便换着用其实它们的内存语义差别极大——尤其是是否拷贝数据这一点直接决定了你是否会在无意中污染训练数据。先看torch.tensor(arr)。它的特点是无脑拷贝无论你传入的是 numpy 数组、list、还是另一个 tensor都会把数据复制一份到新的 tensor 内存中。转换之后的 tensor 和原来的 numpy 数组互不影响你改数组tensor 纹丝不动反过来也一样。由于总是创建独立副本它是最安全、但也是开销最大的方式。还有一点容易被忽略torch.tensor在传入 Python list 时会根据元素自动推断 dtype浮点默认float32整数默认int64但如果传入的是 numpy 数组它则会保留 numpy 数组原有的 dtype。也就是说np.array([1.0,2.0])这种float64数组转出来就是torch.float64并不会像 list 一样变成torch.float32。这一差异往往就是模型输入报错的源头。再看torch.from_numpy(arr)它是不拷贝、共享内存的。它直接把 numpy 数组的底层内存包装成 tensor两者共享同一块存储空间。这样做的优点是零拷贝、速度极快适合大数组的即时转换缺点是你得时刻记住任何一方的原地修改都会同步影响另一方。我在某次数据增强实验里就吃过这个亏用from_numpy把一批图像转成 tensor 喂给模型后面又为了调试直接arr * 2修改了原数组结果训练数据静悄悄地被放大了一倍指标全线异常找了半天才定位到问题是共享内存导致的。另外还有一个硬性限制from_numpy只支持 CPU 上的、内存连续的 numpy 数组。如果原数组是切片或者转置后的非连续视图会直接报ValueError: ndarray data is not C-contiguous。遇到这种情况处理方式是先用np.ascontiguousarray(arr)变成连续数组再转换。最后一个torch.as_tensor(arr)则是一种尽力而为不拷贝的策略如果传入的 numpy 数组是 CPU 内存、dtype 也与目标 tensor 一致它就选择共享内存零拷贝如果设备或 dtype 不匹配则会退化为拷贝。它介于前两者之间适合写一些通用工具函数时使用但正因为行为依赖条件对于业务代码反而容易造成困惑。那么实际写代码时怎么选我个人的原则是追求性能且能接受共享内存用from_numpy追求安全、不想让数据互相牵连用torch.tensor写通用库函数时考虑as_tensor。而把 tensor 放到显卡上又是另一个环节无论哪种方式转出来的 CPU tensor都要再用.to(cuda)搬到 GPU。import torch import numpy as np arr np.random.rand(3, 224, 224).astype(np.float32) t_share torch.from_numpy(arr) # 共享内存零拷贝 t_copy torch.tensor(arr) # 独立拷贝安全 t_adapt torch.as_tensor(arr) # 条件共享语义较灵活 t_gpu torch.from_numpy(arr).to(cuda) # 搬到 GPUdtype 仍为 float32这里要提醒一句.to(cuda)默认只搬设备、不改变 dtype。如果你的 numpy 数组是float64转成 tensor 后照样是float64搬上 GPU 后模型依然会报Double错误。所以常见做法是t_gpu torch.from_numpy(arr).to(devicecuda, dtypetorch.float32)一次性把设备和精度都搞定。3. tensor 转回 numpydetach、cpu、numpy 的顺序决定了成败反向转换——从 tensor 回到 numpy——看起来更简单一个.numpy()就完了但实际上这里埋伏着两个高频报错几乎每天都能在各大社区看到RuntimeError: Cant call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.RuntimeError: Cant call numpy() on Tensor that is not on CPU. Use tensor.cpu().numpy() instead.第一个报错是因为 tensor 还在计算图里挂着梯度信息。PyTorch 为了安全起见不允许一个requires_gradTrue的 tensor 直接转成 numpy——你转出去的就是一份脱离计算图的死数据一旦改动可能导致梯度传播时内存状态不一致。解决方法是调用.detach()把 tensor 从当前计算图中分离出来。分离后的 tensor 和原 tensor 仍共享底层存储所以.detach().numpy()得到的数组修改一样会影响原 tensor 的底层数据除非你明确用.clone()再转换。第二个报错更加隐蔽。很多人在 GPU 上训练完模型直接对预测结果调用.numpy()得到的却是 not on CPU 的报错。原因在于.numpy()只支持 CPU tensorGPU 上的数据根本没有对应的 numpy 内存结构可以承载。策略就是先.cpu()把数据拷贝回 CPU然后再转 numpy。于是一个标准的输出转换链就变成了这样logits model(x) # GPU 上的 float32 tensorrequires_gradTrue pred logits.argmax(dim1) # 仍是 GPU tensorint64 # 标准三步走 pred_np pred.detach().cpu().numpy()三步的顺序可以记忆为先摘掉梯度detach再搬回 CPUcpu最后转数组numpy。调用顺序反过来其实也行比如.cpu().detach().numpy()同样有效但先.detach()会更语义化一些也避免在requires_gradTrue的 CUDA tensor 上直接触发某些算子时的额外开销。另外需要注意.numpy()返回的数组与 CPU tensor 是共享内存的。如果 tensor 在 CPU 上且不要求梯度.numpy()给出的数组就是 tensor 数据的视图tensor 被改动numpy 数组也会同步变化。需要一份真正独立的数组时应该写成tensor.cpu().detach().clone().numpy()。实际项目里模型输出的 logits 往往是float32但如果是 AMP 混合精度训练输出可能直接是float16类型。float16转成 numpy 数组当然是允许的但在继续计算评估指标、保存可视化结果的时候float16的精度很容易造成误差累积。更稳妥的做法是在转 numpy 之前先把输出提升到float32即logits.detach().float().cpu().numpy()。这一条链是我平时用得最多的写法后面封装工具函数时也推荐统一走这个模板。4. dtype 转换的正确姿势astype、to、type、float()/long() 到底怎么选框架间互转之外同一个库内部的 dtype 转换同样不能掉以轻心。numpy 侧的 API 是.astype()torch 侧则有.to(dtype)、.type(dtype)、还有一堆快捷方法如.float()、.long()、.int()、.half()、.double()、.bool()。看起来选项繁多其实原理和适用场景差异很大。先看 numpy 的.astype()。它默认会返回一个新数组原始数组的数据不会被修改你也可以传copyFalse让它在可以安全复用内存时尽量不拷贝但常规使用直接默认即可。有一类极其常见的需求是把图像数据从uint8的[0,255]范围转换到float32的[0,1]范围写法就是img.astype(np.float32) / 255.0。这里要注意如果先做除法再做astype你的除法结果本身已经是float64了所以正确的顺序是先 astype 再除避免引入不必要的双精度中间变量再转回来。与.astype()容易混淆的是.view()。astype会生成一个新数据 新解释的数组而view只是改变对同一块内存的解释方式不改变底层字节。比如uint8数组.view(np.int8)后每个元素还是原来的 8 位字节只是被解释成了带符号整数。这种操作在图像格式转换里偶尔会用到但安全性差、容易出现数值跳跃业务代码里能用astype就别用view。再看 torch 侧。.to(dtype)是最正规、最推荐的用法它不仅能转换 dtype还能同时指定设备tensor.to(devicecuda, dtypetorch.float32)一步到位语义也最清晰。.type(dtype)是偏旧版的写法也支持tensor.type(torch.cuda.FloatTensor)这种设备类型组合但可读性不如.to()。快捷方法.float()、.long()等本质上是.to(torch.float32)、.to(torch.int64)的语法糖在代码里看起来很简洁不过你心里要清楚它们在做什么。torch 的.to()有一个容易被忽略的行为如果 tensor 已经在目标 dtype 和设备上它会返回原 tensor 本身如果在不同 dtype 或不同设备上则返回一个新 tensor原 tensor 保持不变。所以不要把.to()当成可以原地改类型的操作赋值时必须写t t.to(torch.float32)只写t.to(torch.float32)而不接住返回值类型根本没变。这一点跟 python 字符串不可变的语义类似忘记接返回值是初学者最常犯的错误之一。举几个实战中的典型转换# float64 的 numpy 输入喂给 float32 模型前先转 torch.float32 t torch.from_numpy(arr).to(torch.float32) # arr 为 float64 # 标签数据从 int64 转成 int32某些自定义损失函数不接受 long label label.to(torch.int32) # 预测概率输出转成半精度放到 GPU 上为 AMP 做准备 prob logits.softmax(dim1).to(devicecuda, dtypetorch.float16) # 分割结果保存成 uint8 图像掩膜 mask_np pred.to(torch.uint8).cpu().numpy()最后提醒一个格式上的坑numpy 数组和 tensor 相互转换时如果一侧是int64、另一侧是不支持的类型很容易出现隐式截断或报错。比如 torch 的int64tensor 用.numpy()转出来是 numpy 的int64这没问题但如果你在一个 Windows 环境下用默认方式创建 numpy 数组得到的可能是int32而 PyTorch 的默认整数 tensor 是int64。两者互转时如果直接用torch.from_numpy()你得到的 tensor 就是int32后续和int64的标签张量做比较运算时又会出现不一致。这种情况下显式写出dtypenp.int64或者dtypetorch.int64是唯一的解法。5. 训练流水线上的完整转换链路从图片读取到结果落盘理论讲了不少把完整链路串一遍会更直观。假设你正在做一个图像分割项目输入是 HWC 格式的 RGB 图像 numpy 数组模型输出是[B, C, H, W]的 logits最后要保存一张uint8的掩膜图片。下面是我实际项目里会写的一段完整转换流程每一行的意图都标注清楚import numpy as np import torch def preprocess(img_np, mean(0.485, 0.456, 0.406), std(0.229, 0.224, 0.225)): # img_np: HWC uint8, 取值范围 [0, 255] img img_np.astype(np.float32) / 255.0 # 先转 float32 再归一化避免 float64 中间态 img (img - np.array(mean, dtypenp.float32)) / np.array(std, dtypenp.float32) t torch.from_numpy(img) # 共享内存零拷贝 t t.permute(2, 0, 1) # HWC - CHW变成非连续视图 t t.contiguous() # 确保内存连续 t t.unsqueeze(0) # CHW - 1CHW模拟 batch 维 return t.to(devicecuda, dtypetorch.float32) # 搬上 GPU 并明确 float32 def postprocess(logits, save_path): # logits: 1CHW float32 pred logits.argmax(dim1) # 1HW int64 pred pred.squeeze(0) # HW mask_np pred.to(torch.uint8).cpu().numpy() # 转 uint8 掩膜 # 这里的 mask_np 已经是 0/1/2/... 的类别编号数组可直接用 cv2/PIL 保存 return mask_np这段代码里有几个值得留意的细节。permute之后 tensor 变成了非连续的视图如果直接喂给某些算子效率会下降甚至部分算子直接不支持非连续输入所以contiguous()是必要的。from_numpy共享内存意味着后面.to(devicecuda)会复制一份到 GPU原 numpy 数组之后怎么改都不会影响 GPU tensor——但如果整个过程一直在 CPU 上操作就需要格外小心共享内存的副作用。模型评估阶段最常见的另一条链路是从测试集读入int64标签 → 网络输出float32logits → 计算argmax→ 得到int64预测 → 转 numpy 后与标签计算指标。这里最容易翻车的就是标签和预测的 dtype 不统一。比如你用np.load(label.npy)读进来的标签可能是int32而模型的预测结果转出来是int64两个数组做相等比较时 numpy 虽然能自动广播但在某些数值范围下会出现预期外的结果。我的习惯是全部统一成np.int64再比较。如果涉及混合精度训练AMP还有一个隐藏问题AMP 训练时模型权重可能是float16模型输出也可能是float16。保存结果时float16的数组直接转 numpy 只能得到半精度数组后续如果要叠加颜色、做形态学处理半精度会造成精度损失。我的做法是先把输出logits.float()提升到float32再走detach().cpu().numpy()。这条路径在实战中几乎不会出错建议直接抄。6. 那些让你怀疑人生的边角问题非连续内存、Windows 默认类型与 bfloat16文章的最后一部分我把一些平时不太会被写在文档里、但实际经常绊倒人的边角问题集中梳理一下。第一个是contiguous问题。from_numpy要求 numpy 数组是 C 连续的.numpy()则一般要求 tensor 是连续的。数据经过transpose、permute、narrow等操作后会变成非连续视图此时直接调用.numpy()可能会得到拷贝而非视图甚至在某些版本报错。稳妥的检查方式是tensor.is_contiguous()如果不是就调用.contiguous()。注意.contiguous()在已是连续时会返回自身没有额外开销所以随手加上也不亏。第二个是跨平台的默认类型差异。Windows 上 numpy 创建默认整数数组时np.array([1, 2, 3]).dtype是int32而在大多数 Linux 服务器上是int64。这导致同一份数据预处理代码在自己的 Windows 笔记本上调试一切正常提交到 GPU 服务器上却在使用torch.from_numpy时得到int32与项目其他地方的int64不一致。规避方法只有一个所有整数数组创建时都显式指定dtypenp.int64不要依赖默认值。第三个是bfloat16的兼容性。PyTorch 在 AMP 和某些大模型推理场景下大量使用torch.bfloat16它省内存、保留更多指数位是目前训练大模型的重要类型。但 numpy 完全没有bfloat16你甚至没法用一个 numpy 数组承载这种类型的数据。因此任何类型的bfloat16tensor 转 numpy 前都必须先提升精度普遍做法是.float().cpu().numpy()。忽略这一步得到的结果要么报错要么在隐式转换过程中丢失信息。其实绕了这么多我最想分享的经验是不要在每个使用点手写转换逻辑而是把转换封装成几个工具函数全项目统一调用。比如我习惯写一个to_numpy(tensor)内部固定执行tensor.detach().float().cpu().numpy()然后根据业务需要决定要不要astype。这样无论 AMP、CPU/GPU 切换、还是requires_grad状态变化你都只需要改一个函数而不是在所有调用点各改一遍。数据类型的坑绝大多数来源于每个地方写法不一样、各写各的默认参数统一收敛之后这类问题就很难再出现了。最后再分享一个小技巧调试 dtype 问题最快的办法不是看报错而是直接打印两行print(tensor.dtype, tensor.device, tensor.requires_grad)和print(array.dtype, array.shape)。十个相关性报错里九个只要看一眼这两行就能定位原因。把这些检查养成习惯类型转换就不会再成为你项目里的隐形炸弹了。

相关新闻

SDIO接口与TF卡调试:从概念到实战的完整指南

SDIO接口与TF卡调试:从概念到实战的完整指南

说实话,我最初把SDIO和裸SPI当成一回事来调TF卡,结果就在“读不到卡”这个看似简单的问题上硬生生耗了三天。后来把SDIO接口、SD协议、TF卡这三层关系彻底捋清楚,再回头看调试过程,发现大多数问题都出在基础概念没有对齐上。这篇内…

2026/10/15 16:54:00 阅读更多 →
从MathorCup C题看自动泊车路径规划的全链路建模与实践

从MathorCup C题看自动泊车路径规划的全链路建模与实践

简介:2022年MathorCup高校数学建模挑战赛C题「自动泊车问题」完整PDF文档,聚焦无人车在停车场中的路径规划与泊车模型构建,属于数学建模竞赛真题资源。资源面向参加数学建模竞赛的高校学生、研究自动驾驶路径规划的开发者,尤其适合…

2026/10/15 16:52:59 阅读更多 →
STM32+华为云IoT+Qt:从零搭建远程智能家居控制系统全栈实践

STM32+华为云IoT+Qt:从零搭建远程智能家居控制系统全栈实践

先说个我观察到的现象:身边不少人做嵌入式或硬件 DIY,把 STM32 的温湿度、烟雾、继电器这些模块玩明白之后,下一步几乎都会卡在同一个地方——怎么联网,怎么在电脑上远程看状态和发控制指令。有朋友直接问我:“我做完了…

2026/10/15 16:52:59 阅读更多 →

最新新闻

STM32双重ADC多通道DMA采集七路信号实战:解决数据错位问题

STM32双重ADC多通道DMA采集七路信号实战:解决数据错位问题

前阵子调一块电源监控板,七路模拟信号要同时送进 STM32F4:三路电池电压、两路电流采样、一路温度、一路备用通道。我一开始想得很简单,一个 ADC 扫描到底——ADC1 一口气配七个通道,DMA 把数据搬出来,完事。真跑起来才…

2026/10/15 17:46:01 阅读更多 →
Linux服务器Tomcat部署实战:从环境配置到systemd管理

Linux服务器Tomcat部署实战:从环境配置到systemd管理

Linux上装Tomcat这件事,网上教程一抓一大把,步骤看起来也简单:下载压缩包、解压、启动,浏览器打开8080就完事了。可真到了生产环境,你大概率会遇到各种“教程没说”的问题。我自己这些年处理过不少类似的部署需求&…

2026/10/15 17:46:01 阅读更多 →
B2B产品战略规划:从市场边界到路线图的五步框架

B2B产品战略规划:从市场边界到路线图的五步框架

这两年我一直在做企业级软件的产品规划,每次到年底,最怕听到的就是老板问“明年路线图是什么?为什么先做这几块?”说实话,B2B 产品规划最难的从来不是画原型,而是把三件事串成一条逻辑链:我们到…

2026/10/15 17:46:01 阅读更多 →
操作简便吗?8款AI论文平台梯队榜,毕业冲刺必备!

操作简便吗?8款AI论文平台梯队榜,毕业冲刺必备!

四大测评维度解析: 学术专业性:工具是否理解学术规范,输出内容是否符合论文逻辑与深度要求。文献支撑能力:能否引用真实、权威的参考文献,避免"空中楼阁"式生成。查重合规性:生成内容的原创性如何…

2026/10/15 17:46:01 阅读更多 →
从消息边界到粘包拆包:应用层自定义协议设计实战

从消息边界到粘包拆包:应用层自定义协议设计实战

1. 为什么需要应用层自定义协议平时做Linux网络编程,绝大多数场景下我们都在跟现成协议打交道:HTTP、WebSocket、MQTT、Protobuf封装的gRPC,拿来就能用。但一旦业务跑偏,比如做物联网设备端的上行数据、做游戏客户端的实时指令、做…

2026/10/15 17:46:01 阅读更多 →
无线充电电动牙刷量产级单片机固件源码解析

无线充电电动牙刷量产级单片机固件源码解析

简介:本资源为无线充电电动牙刷嵌入式软件源码工程,面向单片机初学者、嵌入式开发工程师及智能硬件爱好者,聚焦电机精准控制、低功耗无线充电管理与多传感器协同等典型物联网终端开发场景。压缩包含33个文件,以17个C源文件&#x…

2026/10/15 17:45:01 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →