图灵星环:Python NumPy数组的维度压缩squeeze删除单维度

在进行数据处理工作的时候, 如果大家选择使用 NumPy 这个工具来处理数组相关的东西,那么通常会碰到一种比较特别的情况, 就是数组里面会存在一些多余的维度, 这些维度的长度都是1, 它们不会装任何有用的数据内容, 只会单纯地提高数组维度方面的冗余程度, 最终就会导致数组的形状变得非常复杂和繁琐, 从而让大家在后续想要做切片运算、想要和数据对接、或者想要在绘图时输出结果等操作时遇到各种不方便的事情。

NumPy 里面有一个办法, 这个办法专门用来把数组里那些长度等于一的所有维度或者指定维度的东西删掉, 它能够压缩数组的维度, 让数组的结构变简单, 它是数据分析领域还有机器学习做数据预处理时候经常要用到的基础方法。

一、核心概念:什么是单维度(长度为1的维度)

要想去弄明白那个方法, 就得先把单维度的这个词儿到底是啥个意思给弄清楚。如果在你拿NumPy数组的时候, 去看它的形状参数, 要是碰见某一个维度的数值等于的那个一的话, 那么这个维度呢, 它就是没啥大用处的, 属于那种多余的单维度。

这里咱们可以举一个挺简单的例子来解释一下, 那个形状写成(1, 5)的二维数组, 其实就是代表它有1行还有5列, 这种情况下, 因为这一行的维度长度是1, 所以咱们就把它叫做单维度;再看另一个形式为(5, 1)的二维数组, 它的列维度长度也是1, 所以同样也属于单维度的范畴;至于说更复杂一点的, 比如那个形状是(1, 5, 1, 3)的四维数组的话, 大家可以注意到, 里面的第一个以及第三个维度, 它们的长度都是1, 这种维度通常就被认为是冗余的。

这些单维度的操作, 它并不会改变数组内部有效数据的多少, 它所做的仅仅是增加了数组在维度上的层级数量, 而该方法的核心作用就在于, 它能够非常精确地把这些没有实际意义的无效维度给剔除掉, 并且是在不改变数组原始数据的情况下, 去让数组的形状变得更简单。

二、 方法基础语法与核心特性

它是NumPy数组的一个内置方法, 在使用的时候不需要去进行那些复杂的参数配置, 所以它的基础使用逻辑属于那种比较简单而且效率比较高的类型。

它的核心特性可以总结到这么几个点里面去, 第一个点是说要自动地把那些长度等于1的维度全都给剔除掉, 第二个点是说要保留那些长度确实是大于1的有效维度不被破坏, 第三个点的描述是说数据的顺序情况、里面的数值内容以及总的数据量, 这三个方面都是做到了完全保持不变这样一个状态。

这个方法支持在不做任何参数设置的情况下直接进行使用, 也可以让用户指定具体的维度来实现精准的删除操作, 这两种方式能够分别适应不同的应用场合。当默认不传入参数的时候, 程序会对数组中包含的所有维度进行全面扫描, 并把这些单个维度的部分全部压缩并移除掉。

如果用户在调用时指定了特定的维度, 那么系统就只针对那些被明确指定的、且长度确实为1的目标维度进行处理并完成删除工作, 除此之外, 其他所有的维度都维持原状不会发生任何变化。

你还需要牢牢记住有一条非常重要的规则存在, 这规则说清楚只能把那种长度等于1的维度进行删除操作, 要是去尝试对长度大于1的维度执行删除动作的话, 程序本身是不会去执行相关操作的, 同时也根本不会跑出错误的提示来, 相反它会直接把原本的那个数组给返回过去, 这就是这个方法里面所自带的容错处理机制的具体体现。

三、默认全局压缩:删除所有单维度

默认无参数的操作是最常见的场景。在数组中存在多处冗余单维度的情况。这种时候需要使用统一简化结构的方法。

举个例子, 一维数据被封装成了四维数组, 这个数组的形状是(1, 1, 6, 1), 数组里的有效数据就只有6个元素, 剩下的三个维度全都是没有用的单维度。

在经过了默认的压缩操作之后, 所有长度为1的维度会被统统删掉, 数组的形状直接就简化成了(6)。这样一来, 原本那个冗余的四维数组就变成了标准的一维数组, 数据完全保留下来了, 结构也更加简洁了。

再有一个例子就是, 对于那些形状(1, 8)的二维行数组, 在默认被压缩之后, 会直接变成形状是(8)的一维数组;同样是那些形状为(8, 1)的二维列数组, 也会一样地被压缩, 最终得到的结果也都是一个形状为(8)的一维数组;这种做法之所以在数据处理里面经常被拿来作为一个统一行数组、列数组格式的常用技巧使用, 其主要目的就是为了去解决那些由于行数、列数的维度没有办法达到完全一致, 从而引发运算报错问题的现象。

四、指定维度压缩:精准删除单个冗余维度

面对情况非常复杂的, 维度非常多的那种数组的时候, 并不是说所有的那些单个维度的东西都是没有用的或者是多余的东西。有一些长度为1的维度, 很有可能是后面要做的一些计算操作当中所使用的, 需要的那种结构性的维度。

在这样的时刻, 我们不可以去进行一个整体的、全部的压缩处理。必须得通过去指定具体的那个维度的办法, 然后才能准确无误地、精确地去删掉那些确实是多余的、冗余的维度。

维度的这个计数的做法, 它是遵循那个 NumPy 的通用规则的, 具体的规则是什么, 是从左往右去数, 并且是从数字 0 开始, 一个一个地依次去编好这个号的, 我们拿一个形状是(1, 4, 1, 5)的四维数组来进行举例说明, 在这个例子里面, 这四个维度它们被编上的号码就是依次成为了 0、1、2 和 3, 至于那编号为 0 的维度和编号为 2 的维度, 它们俩, 都是那种长度仅为 1 的所谓的单维度。

如果您只是想要把位于第一个位置的那个多余的维度给去掉的话, 那么就可以指定0号这个维度来做压缩操作, 经过这么一压缩之后, 数组的形状就会变成我们看到的(4, 1, 5)这种情况, 这里我们仅仅剔除了那个目标性的冗余维度, 而2号维度的那种只有一个值的情况则是被完整保留下来了;但是如果情况相反, 您只想要删除中间位置的2号维度的话, 那么完成压缩之后的数组形状就变成了(1, 4, 5)这样了, 像这种精准的压缩方式, 能够非常灵活地把您真正需要的维度结构给保留下来, 同时只是清理那些没有任何用处的冗余维度, 以此来适应那些非常精细化的数据处理的某种需求。

五、 方法的核心使用场景

  1. 在机器学习或者深度学习框架里面, 模型输入数据和输出数据常常会自己生成一些没有用的单独的一维结构, 这种现象叫做冗余单维度, 这就导致了数组的维度数量对不上, 使得它们没办法直接放在一起进行计算工作。

通过快速压缩这种多余维度的方法, 可以对数据的格式做调整, 让它们变成一个统一的标准样子, 从而能够满足模型对于输入和输出的具体要求。

  1. 进行可视化数据预处理的时候, 因为现有的绘图工具只能支持一维或者二维的标准数组来画图, 如果出现了带有单维度的一般的低纬度的高三维数组, 就会导致画图报错。

所以在使用了删除那些没有用的、多余的维度之后的这个操作处理后, 这些数据就可以直接拿过来画曲线、画柱状图、还有画热力图等这些种类的可视化内容了。

  1. 数组运算的格式实现了统一, 在进行数据的拼接操作, 包括有加、有减、有乘、还有除法这样的操作, 也包括矩阵里的那些运算, 这些操作对数组内部维度的匹配程度要求是非常高的, 如果行列的维度存在大于1的这种情况, 也就是出现了冗余维度, 这就会直接导致维度不匹配的报错, 系统可以快速地对数组的形状进行规整, 这样就能保障运算能够正常地执行下去。

  2. 针对高维冗余数据进行清洗, 因为部分在读取阶段得到的数据以及通过批量生成的数组里可能会出现多层嵌套的结构, 其中会存在单维度上的重复信息, 要是靠人去手动修改维度不仅非常麻烦, 特别容易出错, 所以现在能够使用一键功能来批量清理掉这些多余的内容, 从而有效提升数据处理方面的效率。

六、关键注意事项与避坑要点

第一个问题, 是这种方法它不会去修改原本的那个数组, 所以被压缩过之后的新的那个数组你得重新给它赋值然后保存好, 你要是没有这么做的话, 那么原来那个存有冗余数据的数组就什么都不会发生改变, 这一点是很多刚入门的新手特别容易忽略掉的一个知识点。

第二点, 不允许强行去压缩那些不是单一维度这样的东西。一旦指定的那个维度的长度超出了1这个界限, 系统并不会抛出错误信息, 也不会对数组进行任何改动, 而是直接把原来的数组返回给调用者, 这样就不会破坏里面的原始数据了, 所以说它具备相当不错的容错能力。

但是, 大家在操作之前一定要先去仔细核实一下数组的具体形状是什么样的, 目的是为了避免那些没有实际意义的操作发生, 从而造成不必要的麻烦或资源浪费。

第三, 需要搞清楚这两个东西到底哪儿不一样。大家都能拿改数组形状来说事儿, 可它们的核心逻辑是完全不一样的。一个是把维度给强行重构了, 想怎么组合都随你便, 搞不好还会让数据的排布逻辑乱套。

另外一个呢, 是挺聪明地去掉那些多余的维度, 只删那些没用的单维度, 铁定不会动数据的排布和有效维度的结构。这东西安全程度更高, 就是专门用来清理那些多余维度的。

七、总结

这个工具在 NumPy 里面, 它非常简单, 而且运行起来也很快, 主要用来做维度的优化。它的核心价值就是清理掉那些没有用的单维度数据, 这个过程不会造成任何信息损失, 同时还能简化数组里的结构, 把数据的格式统一成一个标准。

如果你想要一下子就把所有冗余的维度都压缩掉, 可以用默认的、适用于全局的压缩方法, 这种适合快速清洗。如果你只想调整特定的维度, 就需要指定具体的维度来进行压缩, 这种方法比较精细。这两个功能都能很好地配合日常工作里的数据分析、用机器学习来做预处理、还有画画那种数据可视化等各种各样的场景。

只要熟练掌握了这个办法, 是能够有效解决那些像数组维度存在多余的这种问题,还有维度对不上的这种常见问题, 所以能够大幅度提升在运用 NumPy 处理相关数据的时候的简洁性, 以及稳定性。

相关推荐
方方洛3 小时前
ray教程-25-附录E-端到端实战案例
人工智能·分布式·机器学习
这张生成的图像能检测吗4 小时前
(论文速读)Ponder:通过神经渲染进行点云预训练
人工智能·深度学习·机器学习·点云·3d技术·神经渲染
在所不辞兄5 小时前
为什么生成对抗网络训练常不稳定,模式崩溃与判别器过强之间是什么关系?
人工智能·深度学习·神经网络·机器学习
Zachery Pole6 小时前
【PlaNet 2】-RSSM机制
人工智能·深度学习·机器学习
硅谷秋水1 天前
AgenticRoboRL:将“编程智能体”后训练引入智能体化机器人领域
人工智能·机器学习·语言模型·机器人
硅谷秋水1 天前
DiscoveryRSI:通过递归学习发现有价值的假设
人工智能·机器学习·语言模型
hkNaruto1 天前
【AI】游戏大模型智能体OODA过程记忆问题解决方案:AgenticSTS 有界记忆契约:技术分析与流水线改造操作手册
人工智能·游戏·机器学习