NumPy数组升维全攻略:二维拆三维、三维拆四维与常见坑
标题里这句话听起来有点绕二维数组拆成三维三维再拆成四维。我第一次接到这个需求的时候第一反应是“这有什么好拆的”后来才发现这一句话背后是数据工程师和算法工程师每天都在干的活——把表格状的二维数据整理成带批次、带通道、带时间步的高维结构。在Python里做这件事目前最主流、也最顺手的工具就是NumPy。很多人一上来就写reshape但维度一变就懵为什么拆完以后数据全乱了为什么明明叫“拆分”总数却没变为什么三维转四维时多出来的那个“1”到底该放在哪个位置这篇文章我从头到尾把这件事讲透。先聊维度到底是什么再分别拆解二维转三维、三维转四维的常见场景和写法最后附上几个可以直接复制的模板和踩坑记录。不管你是刚接触NumPy的初学者还是已经写过不少数据处理脚本、但遇到高维数组依然心里没底的人这篇文章应该都能帮上忙。1. 维度到底是什么先从shape元组读起1.1 从左往右读shape一层一层剥“套娃”数组的维度英文叫dimension但在NumPy里我们几乎不直接说“几维”而是看shape这个元组。比如shape (3, 4)意思是二维数组最外层有3个元素每个元素里面又有4个数。记住一个判断规则shape元组里有几个数数组就是几维的。元组从左往右读每一层都代表“这个维度下有多少个容器”。拿(2, 3, 4)举例它说的是最外层有2个大容器每个大容器里有3个中容器每个中容器里装着4个具体数值。我用一个生活类比帮你建立直觉。二维数组就像教室里的座位表每个座位对应一个数据行和列就是两个维度。三维数组就像一栋教学楼里有好几间教室每间教室里都有一张座位表。那四维呢就是学校里有好几栋教学楼。你现在应该明白了维度不是“数据变大了”而是“嵌套层次变多了”。看形状的时候还有一个细节轴axis的编号从0开始。shape (2, 3, 4)里axis0是2axis1是3axis2是4。后面所有关于“沿哪个轴拆分”的操作都会用到这个概念。1.2 数组“拆分”之前先弄清三件工具的分工“拆分”这个词在NumPy里有三种完全不同的动作很多人一上来全用reshape就是因为没分清楚它们。第一种是reshape它不改变数据总量只改变排列分组方式。12个数字可以排成(3, 4)的二维表也可以排成(2, 2, 3)的三维块总数始终是12。第二种是np.expand_dims或者np.newaxis真正的“升维”在指定位置插入一个大小为1的新轴比如把(3, 4)变成(1, 3, 4)。第三种是np.split沿某个轴把数据切成多份它返回的是多个子数组组成的列表切完以后每个子数组的维度保持不变。现实中大部分“把二维数组拆成三维、把三维拆成四维”的需求其实是这三种动作的组合。比如你想把一份(4, 6)的表格拆成“两批、每批两行、每行6列”的(2, 2, 6)这时候用的是reshape不是split。只有当你确实想把数据从某个轴中间一刀切开时才轮到np.split上场。1.3 reshape的底层逻辑先拉平再装填顺序很重要reshape之所以让人困惑是因为它看起来是“重新分组”但底层的操作方式非常机械先把原数组按顺序拉平成一长串再按新shape一层一层填回去。默认的拉平顺序是C order也就是“行优先”。你从内存的角度理解就是先取第一行所有元素再取第二行所有元素。比如一个(2, 3)的数组顺序是第0行的3个值然后是第1行的3个值。拉平后变成6个元素的序列然后放入(3, 2)的新壳子里时也是从新的第0行开始依次放。这意味着reshape之后数据归属哪一格完全由“先来后到”的线性顺序决定而不是按二维块去整体搬运。如果你心里想的是“把左上角这块搬到新数组的某个位置”那很可能就是数据错乱的开始。后文我专门用一节来讲这个坑这里你先记一点reshape不是切块是“串起来再重新串”。2. 二维转三维三个高频场景与对应写码姿势2.1 多份二维表合并成带批次的三维结构实际工作里最常见的二维转三维需求是把多张结构相同的二维表堆成一摞。我举一个很常见的例子某个传感器每隔1秒采集一次数据每次采集包含温度、湿度、压力三个特征值。1小时的数据就是一个(3600, 3)的二维数组。现在你有7天的数据想把它们变成“天、秒、特征”这样的三维结构就可以用(7, 3600, 3)来表示。写法很简单import numpy as np day1 np.random.rand(3600, 3) # 第1天数据 day2 np.random.rand(3600, 3) # 第2天数据 # 还有day3到day7略 days [day1, day2, day3, day4, day5, day6, day7] data_3d np.stack(days, axis0) print(data_3d.shape) # (7, 3600, 3)np.stack的作用就是把一组相同形状的数组沿新插入的轴堆叠起来。axis0表示把“天”这个维度放在最前面。这里有个容易混淆的点你可能会问用np.array(days)不也能得到(7, 3600, 3)吗确实可以但np.stack的语义更明确而且在某些情况下np.array会先把列表转成数组如果各元素形状不一致它会报错或帮你“补齐”反而不容易暴露问题。我自己的习惯是只要明确知道是在堆叠同形状的子数组就用np.stack。2.2 给二维表增加批次维和通道维另一个高频场景是在机器学习任务里。比如你训练一个模型单条样本是一个一维向量比如100个特征。现在你有一批样本通常会组织成(样本数, 特征数)的二维数组。但有些模型接口要求输入带一个“批次维”哪怕把整份数据当成一个batch也需要变成(1, 样本数, 特征数)。两种最常用的写法X np.random.rand(128, 100) # 写法1用np.newaxis X_3d X[np.newaxis, :, :] print(X_3d.shape) # (1, 128, 100) # 写法2用np.expand_dims X_3d np.expand_dims(X, axis0) print(X_3d.shape) # (1, 128, 100)np.newaxis在切片语法里非常简单:代表这个维度的内容保留原样np.newaxis代表在这里插入一个新维。np.expand_dims则是函数式写法参数axis0表示在shape元组的第0位插入一个大小为1的维度。这里我想多说一句这两个新维度上的“1”不是可有可无的装饰它承载着语义。在图像任务里(H, W)是灰度图(1, H, W)表示明确声明这是一张单通道图像。在序列任务里(1, 128, 100)表示这是一个批次、128个时间步、100个特征。有了这个“1”后面的卷积、池化、归一化操作才能统一处理“通道”或者“批次”这些维度。2.3 用-1让reshape自动算维度少踩两个坑二维转三维时reshape里有一个经常让人头疼的问题新形状里的某个数字到底填什么填错就报错因为元素总数对不上。比如一个(6, 4)的数组总共24个元素。你想变成(2, 3, 4)可以写reshape(2, 3, 4)。但如果你不记得总元素数量或者原数组行数不是固定值最好的办法是让NumPy自动帮你算一个维度。arr np.arange(24).reshape(6, 4) arr_3d arr.reshape(2, 3, -1) print(arr_3d.shape) # (2, 3, 4)这里的-1表示这个维度的值由NumPy根据总元素个数和其余维度自动推断。因为6 * 4 2 * 3 * ?所以-1会被自动算成4。甚至你可以大胆一点写成arr.reshape(6, -1, 4)也会得到(6, 1, 4)因为24除以6再除以4等于1。但注意两个坑。第一-1在shape里最多出现一次因为如果有两个自动推断的维度等式就有两个未知数无法唯一确定。第二自动推断不等于“你不需要理解布局”它只是代替你算乘法除法元素顺序依然是先拉平再装填。如果位置填错数据顺序照样会乱。3. 三维转四维从一堆图像到一段视频3.1 四维数组的四种常见布局三维数组加一个维度变成四维最常出现在计算机视觉里。我直接以图像数据为例帮你建立四维shape的直觉。最常见的四种布局是场景shape含义灰度图批次(N, H, W, 1)或(N, 1, H, W)N张图每张是单通道的H×W彩色图批次(N, H, W, C)或(N, C, H, W)N张图每张是H×W×CC通常是3RGB视频帧序列(帧数, H, W, 通道数)每一帧是一张图批量视频(批次, 帧数, H, W, 通道数)五维了四维以上思路一样这里你重点掌握一个原则四维数组就是把三份或四份三维数据沿一个新轴堆起来。比如你有一个(64, 64)的单张灰度图想表达“一批10张”就可以变成(10, 64, 64)这是三维。然后再想表达“每张图有1个通道”就变成(10, 64, 64, 1)这是四维。一步一步加上去不复杂。3.2 把一批灰度图从(N, H, W)改成(N, H, W, 1)假设你现在已经有一批灰度图shape是(N, H, W)没有通道维而某个图像处理模型要求输入(N, H, W, 1)。你不需要改图像内容只需要在最后面加一个大小为1的维度。三种等价的写法我直接列出来arr_3d np.random.rand(8, 64, 64) # 写法1切片里用np.newaxis arr_4d arr_3d[..., np.newaxis] # 写法2np.expand_dims arr_4d np.expand_dims(arr_3d, axis-1) # 写法3reshape展开shape后加1 arr_4d arr_3d.reshape(*arr_3d.shape, 1) print(arr_4d.shape) # (8, 64, 64, 1)三种写法结果完全一样区别只在可读性和你的个人偏好。arr_3d[..., np.newaxis]里那个...代表“所有现有维度原样保留”非常直观。expand_dims(arr_3d, axis-1)里的axis-1表示在最后一个位置插入新轴。reshape(*arr_3d.shape, 1)则是把原shape元组展开后追加一个1。我自己的偏好是简单场景用[..., np.newaxis]因为一眼能看出插在哪个位置。复杂重组场景用reshape或transpose因为需要精确控制整个shape链。3.3 通道维放在前面还是后面Channels First与Last说到通道维有一个绕不开的历史问题它到底该放在第1维还是最后1维。同一批图像数据在PyTorch里常见的布局是(N, C, H, W)在TensorFlow系的Keras里常见的布局是(N, H, W, C)。这就是Channels First和Channels Last两种约定。如果你需要在两种布局之间切换不能用reshape要用transpose。因为reshape只是按线性顺序重排而布局切换要求的是轴与轴之间交换位置。# 假设当前是(N, H, W, C)想转成(N, C, H, W) arr_nhwc np.random.rand(4, 64, 64, 3) arr_nchw arr_nhwc.transpose(0, 3, 1, 2) print(arr_nchw.shape) # (4, 3, 64, 64)transpose的参数是“新数组每个维度来自旧数组的哪个轴”。(0, 3, 1, 2)的意思是新第0轴是旧第0轴N新第1轴是旧第3轴C新第2轴是旧第1轴H新第3轴是旧第2轴W。很多人在这一步写错顺序导致模型训练时不断报shape不匹配。我给你的建议是写任何transpose之前先在注释里把原始shape和新shape都列出来再对着写轴编号。3.4 沿帧轴切三维数据split与stack组合拳三维转四维还有一种很常见的需求不是“加通道”而是“切片以后再叠起来”。比如一个视频文件解码后帧数据是一个(帧数, 高度, 宽度)的三维数组如果你想把这个视频按时间段切分成多个片段每个片段再作为一个子单元最后组成(片段数, 每段帧数, 高度, 宽度)的四维数组就轮到np.split出场了。frames np.random.rand(90, 32, 32) # 90帧每帧32x32 # 切成3段每段30帧 segments np.split(frames, 3, axis0) print(len(segments)) # 3 print(segments[0].shape) # (30, 32, 32) # 再沿新轴堆叠成四维 segments_4d np.stack(segments, axis0) print(segments_4d.shape) # (3, 30, 32, 32)这里np.split(frames, 3, axis0)表示沿第0轴分成3份要求第0轴大小能被3整除。如果你分成4份而90不能被4整除就要用np.array_split它会尽量均匀切分但各段大小可能不完全一样。segments np.array_split(frames, 4, axis0) for seg in segments: print(seg.shape) # (23, 32, 32), (23, 32, 32), (22, 32, 32), (22, 32, 32)这里我必须提醒你np.stack要求所有子数组形状完全一致。所以如果使用array_split切成大小不等的片段堆叠前需要先补齐、裁剪或者统一用split且保证原轴长度能被段数整除。我在实际项目里见过不止一次因为忽略这一点最后stack直接抛异常的惨案。4. 三个可直接复制运行的实操模板4.1 模板一二维变三维并验证数据归属第一个模板解决“我到底该怎么填reshape参数”的问题。核心思路是先用一个带序号的小数组做实验再决定你自己的数据怎么变。import numpy as np arr np.arange(24).reshape(4, 6) print(原始数组) print(arr) arr_3d arr.reshape(2, 3, 4) print(reshape(2, 3, 4)后) print(arr_3d) print(arr_3d[0]) print(arr_3d[0]) print(arr_3d[1]) print(arr_3d[1])运行结果会告诉你arr_3d[0]里装的是原数组的第0行到第2行按顺序拉平后的前12个元素。也就是说原第0行全部、第1行前几个会进入第0个三维块。你看完这个输出就能直观理解“先拉平再装填”的含义。如果你希望按列优先的顺序拉平可以加orderF参数arr_3d_f arr.reshape(2, 3, 4, orderF)这个参数在某些科学计算场景下有用但大多数工程场景默认的C order反而更好用。我建议你先完全掌握默认行为再考虑去碰order参数否则很容易把自己绕晕。4.2 模板二三维变四维三种等价写法第二个模板是三维加通道维的通用模板适配图像和序列数据。你只需要替换arr_3d和新的维度大小。arr_3d np.random.rand(8, 64, 64) # 8张64x64灰度图 # 在最后加通道维变成(8, 64, 64, 1) out1 arr_3d[..., np.newaxis] out2 np.expand_dims(arr_3d, axis-1) out3 arr_3d.reshape(*arr_3d.shape, 1) print(out1.shape, out2.shape, out3.shape)这里要强调的一点是out1、out2、out3不仅是shape一样数值顺序也完全一致因为它们做的都是“在最后加一个大小为1的轴”。你要验证的话可以用np.array_equal(out1, out2)结果会是True。工作中我看到的实际情况是项目组里不同人写法不一样有人习惯用np.newaxis有人喜欢显式reshape。这没有优劣但有一个原则不能变——每次变换后立刻打印shape并核对注释代码里写清楚每个维度的含义。4.3 模板三三维按轴切分后重组四维第三个模板对应“真拆分”场景也就是沿某个轴把数据切成若干段再拼成四维。arr_3d np.random.rand(90, 28, 28) # 90张28x28图片 # 按每30张一段切出3段 parts np.split(arr_3d, [30, 60], axis0) # np.split第二个参数如果传列表代表切分点 # parts[0]是前30张parts[1]是中间30张parts[2]是后30张 print(parts[0].shape, parts[1].shape, parts[2].shape) # 统一堆叠成四维 arr_4d np.stack(parts, axis0) print(arr_4d.shape) # (3, 30, 28, 28)np.split的第二个参数可以传一个整数均分份数也可以传一个列表切分点。比如[30, 60]的含义是前30张作为一段30到60之间作为第二段60到结尾作为第三段。这个写法在你需要按时间点切数据时尤其方便。如果切出来的段数比较多建议先别急着stack先把每段的shape打印出来检查一遍确认没有因为数据源问题导致某一段是空的或者形状不一致再进入下一步。这个习惯虽然多写了三行代码但能帮你省下不少排错时间。5. 常见错误与排查经验5.1 形状对不上size不匹配的快速判断ValueError: cannot reshape array of size 24 into shape (2, 5, 4)这类报错是我在社区里看到最多的问题。原因很简单新旧shape的元素总数不一致。处理方法也很简单用np.prod快速核对old_shape (6, 4) new_shape (2, 5, 4) print(np.prod(old_shape)) # 24 print(np.prod(new_shape)) # 40看到24和40不相等就知道要去把new_shape里某个数字改成能让乘积为24的值比如(2, 3, 4)。这一步看似基础但遇到大规模数据时手工心算总数特别容易出错用np.prod是最稳妥的做法。如果使用了-1还是报错说明其余维度的乘积已经超过或少于总元素数不存在任何合法的推断值。比如(24,)的数组reshape(5, -1)就会报错因为24除以5不是整数。5.2 数据排列错乱把reshape当split用了这个坑的隐蔽性很高因为它不报错但结果完全不符合预期。比如你有一个24个元素的数组想拆成两个部分每部分12个元素然后分别放入三维结构的两个块里。你可能会写arr np.arange(24) out arr.reshape(2, 12, 1)这样得到的两个块分别装的是前12个元素和后12个元素看起来没问题。但如果你面对的是一个(4, 6)的二维数组你心里想的是“前两行放第一个块后两行放第二个块”直接reshape(2, 2, 6)就有风险。我验证给你看arr np.arange(24).reshape(4, 6) print(arr) # 你期望的块1是 [[0,1,...5],[6,7,...11]] # 块2是 [[12,...17],[18,...23]] out arr.reshape(2, 2, 6) print(out[0]) # 实际输出的是 [[0..5], [6..11]]这确实没问题在这个例子里恰好没问题。但如果有一次你的数组经过转置或者切片的顺序不是行优先reshape的结果就会和你预想的块结构不一样。正确做法是涉及“按块拆”的时候先split再stack而不是直接reshape。因为split是沿着轴真实切分reshape是拉平重排两者的语义完全不同。5.3 非连续数组的坑显式调用ascontiguousarray还有一个比较容易忽略的细节发生在切片和转置连环操作的场景。举个例子arr np.arange(24).reshape(4, 6) arr_t arr.T # 转置后内存里不是连续排列的 print(arr_t.flags[C_CONTIGUOUS]) # False arr_3d arr_t.reshape(3, 2, 4) # 可以成功但NumPy可能会拷贝数据当数组不是C连续时reshape通常需要复制一份连续数据才能完成这在数据量大的时候会带来性能损耗也容易让人误以为只是改了视图。更稳妥的做法是先转成连续数组再reshapearr_t_c np.ascontiguousarray(arr_t) arr_3d arr_t_c.reshape(3, 2, 4)这个技巧在涉及transpose之后继续变换维度的场景里特别实用。我的经验是只要发现数据不是C连续优先考虑ascontiguousarray不要指望reshape帮你自动优化布局。5.4 送入模型前给每个维度写实名标注最后一个习惯比任何技巧都重要。我在给项目组同学做代码评审时发现很多shape错误不是因为不会用API而是因为完全不清楚当前变量每个维度代表什么意思。建议在每次维度变换前后写上注释或者直接用变量名区分。# shape: (batch_size, height, width, channels) # index: 0 1 2 3 frames_batch np.random.rand(16, 128, 128, 3) # 转成(channels_first)布局 # 目标shape: (batch_size, channels, height, width) frames_nchw frames_batch.transpose(0, 3, 1, 2)有时候一个变量经过三五次变换你已经忘了它现在是(N, C, H, W)还是(N, H, W, C)。我的做法是在变量名上做区分比如frames_nhwc和frames_nchw一眼就能看出当前布局。如果命名不够注意就会陷入“打印shape看不出毛病但要区分哪个轴是通道却要想半天”的尴尬境地。遇到维度错误时最快的排查办法是构造一个极小样本。比如用np.random.rand(2, 4, 4)这种小数组跑一遍流程轴和值的对应关系一目了然。在真实的大型数据集上排查维度问题往往会因为数据量大而更难集中注意力小样本反而能快速定位问题。最后再分享一个我自己的习惯任何涉及维度变换的代码我都会三步走——先打印原始shape再打印变换后的shape最后用一个小样例验证数值顺序是否符合预期。这套流程看起来有点“过度谨慎”但这些年我因为维度问题浪费过的调试时间远比写这三步的时间多得多。希望你看完这篇文章也能把“拆数组”这件事从一个绕口的需求变成顺手拈来的基本功。

相关新闻

KaihongOS开发实战:从环境搭建到分布式应用部署的完整指南

KaihongOS开发实战:从环境搭建到分布式应用部署的完整指南

/* 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 19:46:54 阅读更多 →
硬件串口原理与实战:从电平标准到STM32调试全链路

硬件串口原理与实战:从电平标准到STM32调试全链路

/* 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 19:46:54 阅读更多 →
C++高性能内存池实现:多线程无锁分配与性能优化实战

C++高性能内存池实现:多线程无锁分配与性能优化实战

/* 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 19:46:54 阅读更多 →

最新新闻

仓颉社区 IDE Team 双周例会机制与议题决策实践:基于 2026-04-21 例会的治理复盘

仓颉社区 IDE Team 双周例会机制与议题决策实践:基于 2026-04-21 例会的治理复盘

文档开源治理研发协作 【免费下载链接】community 包含Cangjie社区治理、开发者贡献指南、开发者贡献协议、社区交流等内容 项目地址: https://gitcode.com/Cangjie/community 点击查看 免费下载 本文以仓颉(Cangjie)社区 IDE Team 第二次例…

2026/10/14 20:22:41 阅读更多 →
Vortex 代码风格规范(CODESTYLE.md)实战指南:从童子军规则到 TypeScript 工程化落地

Vortex 代码风格规范(CODESTYLE.md)实战指南:从童子军规则到 TypeScript 工程化落地

桌面应用 【免费下载链接】Vortex Vortex Development 项目地址: https://gitcode.com/gh_mirrors/vor/Vortex 点击查看 免费下载 Vortex 是 Nexus Mods 出品的开源游戏模组管理工具,其代码库横跨 Electron 主进程、React 渲染进程、共享工具库与数十个…

2026/10/14 20:22:41 阅读更多 →
进销存ERP源码+小程序二次开发实战:库存扣减、单据流与避坑指南

进销存ERP源码+小程序二次开发实战:库存扣减、单据流与避坑指南

简介:这是一套面向中小企业与开发者的完整进销存ERP管理系统源码,采用VS2012 .NET与MsSQL技术栈,标准版功能简洁实用,已有多家企业稳定运行,适合需要快速搭建电商、销售、采购、生产等业务模块的团队参考或二次开发。压…

2026/10/14 20:22:41 阅读更多 →
C#科学计算器核心:递归下降解析器与表达式求值实践

C#科学计算器核心:递归下降解析器与表达式求值实践

简介:C#科学型计算器完整开发资料,面向正在学习WinForms/WPF桌面编程的高校学生,及需要完成课程设计或巩固C#事件驱动开发的读者。项目覆盖四则运算、对数、正弦余弦、百分比和二进制/八进制/十六进制转换,以“界面控件布局—按钮…

2026/10/14 20:22:41 阅读更多 →
OCLP-Mod 后台守护进程机制全解析:自动根补丁监控、更新预缓存与 KDK 管理

OCLP-Mod 后台守护进程机制全解析:自动根补丁监控、更新预缓存与 KDK 管理

桌面应用CLI系统编程 【免费下载链接】OCLP-Mod A mod version for OCLP,with more interesting features. 项目地址: https://gitcode.com/gh_mirrors/oc/OCLP-Mod 点击查看 免费下载 OCLP-Mod 通过一组常驻后台的 launchd 服务(LaunchAgent / LaunchD…

2026/10/14 20:22:41 阅读更多 →
权威测评!2026年最火AI论文工具榜单,免费款也能高效产初稿

权威测评!2026年最火AI论文工具榜单,免费款也能高效产初稿

一、实测方法论:5 大维度量化评估 本次实测覆盖全学科论文场景,重点考察以下维度,结果客观可复现: 表格 评估维度权重测评标准中文适配度25%是否符合 GB/T7714 引用规范,语言逻辑自然度,术语准确性免费功能…

2026/10/14 20:21:39 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →