向量、矩阵与张量入门:掌握数据维度与形状操作的核心概念

发布时间:2026/10/18 6:19:40
向量、矩阵与张量入门:掌握数据维度与形状操作的核心概念 1. 为什么矩阵、向量这些概念值得认真对待很多朋友一看到“向量”“张量”这几个词第一反应是“这不是数学课上的东西吗跟我有什么关系”。说实话我以前也这么想直到有一次需要处理一批表格数据要把几十个维度的特征放在一起比较才意识到这些概念本质上就是一种“组织数据的通用语言”。你不需要成为数学家但理解了向量和张量你看待数据的方式会完全不一样。向量可以理解成“一批有顺序的数字”张量则是“多维的、带规则的数字立方体”。听起来很抽象但生活里到处都是你的体检报告是一组指标这就是向量一张彩色图片在电脑里是宽乘高乘三个颜色通道这就是三维张量一段视频再加上时间轴就是四维张量。这篇文章想做的就是用最直白的方式把这些概念讲清楚。适合谁看如果你是刚接触数据相关工作的新手或者做开发时总被矩阵相乘、张量形状这些概念绕晕那这篇内容就是为你准备的。我会从最基础的向量讲起一步步扩展到张量中间穿插一些我实际用到的操作习惯和踩坑经验尽量不堆公式主打一个“能看懂、能上手”。提示这篇内容偏基础但我会把一些容易混淆的细节单独拎出来讲哪怕你之前学过也可以当查漏补缺。2. 向量的核心逻辑与容易忽略的细节2.1 先搞清楚向量的本质不是“箭头”是“有规则的一组数”教科书上总喜欢把向量画成一个箭头指向某个方向。这个理解不能说错但容易让人钻进死胡同——好像向量一定得在纸上画出来才行。实际上向量更本质的含义是“一组按位置排列的数字”数字本身是什么含义取决于你用它表示什么。举个例子一个学生某次考试的成绩单“语文90、数学85、英语88、物理76、化学92”这就构成了一个五维向量写作(90, 85, 88, 76, 92)。某个水果店一天的销售记录“苹果30斤、香蕉12斤、橙子18斤”这是一个三维向量(30, 12, 18)。你会发现这里根本没有“方向”和“箭头”但依然可以作为向量处理。因为它们的顺序是有意义的第一个位置的数字永远表示语文成绩或苹果销量不能随意调换。这个“顺序即语义”的特性是我们后面所有操作的基础。从形式上向量常常写成行向量或列向量行向量[90, 85, 88, 76, 92] 列向量[90] [85] [88] [76] [92]行向量和列向量在数学计算中扮演的角色不同但在数据存储中往往只是“排布方式”的区别。这里先记住一个点向量中的数字是并列且有序的。2.2 向量的加法和数乘为什么这两件事是第一课向量加法规则很简单对应位置相加。比如两个学生的三科成绩向量逐项相加就能得到总成绩向量。生活中更典型的场景是你记录了每天的步数和心率把一周的数据逐项汇总就是向量加法。数乘更直接把每个位置都乘以同一个数。比如想把“每斤价格向量”换算成“两斤价格向量”每个数乘2即可。这些规则背后有一个共同的直觉向量操作是“逐个位置独立进行的”。加法和数乘都不会让某个位置的数据影响另一个位置这在编程里叫“逐元素操作”。我第一次用循环写向量加法的时候效率很低后来才知道大部分计算库都提供了批量操作的方法又快又不容易出错。# 以Python中常用的方式为例 import numpy as np a np.array([90, 85, 88, 76, 92]) b np.array([80, 90, 84, 88, 70]) # 向量加法逐元素相加 total a b print(total) # [170 175 172 164 162] # 数乘每个元素乘以2 double_a a * 2 print(double_a) # [180 170 176 152 184]注意向量加法和数乘是后续一切线性运算的基石。如果你觉得这两件事太简单反而要警惕——后面张量的很多规则本质上就是“逐位置操作”在不同维度上的延伸。2.3 向量内积衡量“相似程度”的万能尺向量内积也叫点积的规则是对应位置相乘再全部加起来。比如a [1, 2, 3] b [4, 5, 6] a·b 1*4 2*5 3*6 4 10 18 32这个操作看起来简单但意义非常深远。它可以衡量两个向量的“相似程度”——内积越大说明方向越接近在做归一化处理后。实际应用里搜索引擎判断两篇文章是否相关、推荐系统判断用户和商品的匹配度很多时候都是变换形式的内积运算。我踩过一个坑一开始做文本相似度计算直接把两个词频向量做内积结果长文档总是和任何文档都有较高的内积因为它每个位置上的数都很大。后来才明白要先让每个向量的“长度”变成一致的再比较方向这个问题才解决。这里提到的长度就是向量的模长后面会讲。2.4 向量的模与单位化把“大小”和“方向”分开看向量除了有数字内容还有一个重要的量叫模长或范数计算方式是每个分量的平方和再开根号。对于向量(a, b, c)模长等于√(a² b² c²)。直觉上它表示“这批数字整体的规模”。我习惯把向量想成一条由原点指向某个位置的“线段”模长就是线段的长度。当你想丢弃“大小”而只保留“方向”时就做单位化归一化每个分量除以模长。这样比较两个向量的方向时就不会受模长影响。单位化在机器学习中叫作“归一化”目的是让不同量纲的特征具有可比性。举个例子一个人的身高是175厘米月收入是15000元这两个数值如果放在一个向量里数量级差很多直接算内积时收入会主导结果。归一化之后每个特征都对结果贡献“相对比例”这样才公平。import numpy as np v np.array([3.0, 4.0, 0.0]) norm np.linalg.norm(v) # 结果为5.0 unit_v v / norm # 得到[0.6, 0.8, 0.0] print(unit_v)2.5 一个新手最容易混淆的点向量与标量标量就是一个单独的数比如“今天气温26摄氏度”向量是一组数比如“今天温度26、湿度60%、风速3米每秒”。很多数学操作要区分处理对象是标量还是向量因为规则完全不同。我见过不少同学写代码时试图把“一个数”和“一个数组”直接放在一起做某种操作结果形状对不上报错。这里想强调处理向量时先弄清楚每个位置代表什么再操作否则很容易把位置语义搞混。3. 从向量到矩阵维度升一级规律变得有趣3.1 矩阵就是“多个向量排队”向量可以理解成一维的数据那么多个向量排在一起就构成了矩阵也就是二维数据。举个例子一个班级有5个学生每个学生有三科成绩这5行3列的数表就是一个5×3矩阵。每一行可以看作一个样本的向量每一列可以看作一个属性的向量。如果你处理过Excel表格那对矩阵应该不陌生——行是记录列是字段这正是矩阵的典型形态。矩阵的出现让我们可以同时处理一组向量把对单个向量的操作“批量”进行。从张量角度看矩阵可以理解为“二维张量”。我更喜欢把矩阵理解成一种容器它在行和列两个方向上组织数据每个位置的数据具有“行列”双重身份。3.2 矩阵乘法为什么不是逐元素乘而是“行乘列”很多初学者被矩阵乘法搞晕因为它不是简单的对应位置相乘。矩阵乘法的规则是结果矩阵中第i行第j列的元素等于左矩阵第i行与右矩阵第j列对应元素相乘后加起来。为什么这样设计因为矩阵通常代表一种“变换”乘以一个矩阵相当于执行某种线性变换。行乘列的规则可以组合多个变换效果等同于依次执行这些变换。举一个生活中的例子假如一家店有“苹果、香蕉、橙子”三种水果采购价和售价构成了两个向量你要计算每天的毛利就相当于把“销量向量”和“利润向量”做内积。如果有多天、多种水果就可以组织成矩阵一次算出很多结果。import numpy as np A np.array([[1, 2], [3, 4]]) B np.array([[5, 6], [7, 8]]) C np.matmul(A, B) # 或 A B print(C) # 结果: # [[19, 22], # [43, 50]]这里C[0][0]的计算方式是1×5 2×7 19这就是A的第0行和B的第0列做内积。如果一开始就明白“行乘列是内积的批量版本”矩阵乘法就不难理解了。注意矩阵乘法不满足交换律A×B未必等于B×A。这点与普通乘法完全不同尤其在调整计算顺序时要格外小心。我的习惯是先检查维度再做乘法。3.3 矩阵形状匹配规则一节手指就能记住两个矩阵能够相乘的条件是左侧矩阵的列数必须等于右侧矩阵的行数。结果矩阵的行数等于左侧的行数列数等于右侧的列数。比如(3×4)的矩阵乘以(4×2)的矩阵得到(3×2)的矩阵。我常用“内积适配”来理解左边提供“行”右边提供“列”中间维度必须对齐。一旦维度不匹配计算库会直接报错这在调试时是很好的提示信号。一个常见的实际坑是在做数据处理时需要把数据矩阵转置再相乘因为维度顺序不对。转置操作就是行列互换别看它简单很多问题都是因为没转置而导致的。3.4 单位矩阵、转置和逆矩阵三个基础工具单位矩阵是主对角线都是1、其余为0的方阵行数等于列数的矩阵任何矩阵乘以单位矩阵结果还是它本身类似乘法中的“1”。转置矩阵是把行列互换常见于调整计算维度。逆矩阵则是用于“撤销”某个线性变换的矩阵。这三个概念刚开始看可能觉得抽象但在实际代码中处处用到。比如求解线性方程组、计算数据协方差、做线性回归都会涉及转置和求逆。我建议学习时不用死背公式先理解它们“干什么”等遇到相应场景再回顾细节。4. 张量不止二维而是“带规则的多维数据”4.1 张量的本质多维数组变换规则张量这个词听起来唬人但在很多编程框架里张量就是一个“多维数组”。标量是0维张量向量是1维张量矩阵是2维张量更高维的就是3维、4维张量。但只把它理解成多维数组还不够全面。数学上张量还要求“在坐标变换时遵循特定规则”这一点在物理和工程中非常重要。不过对于大多数入门场景你可以先把它当作“多维数组”来用理解它怎么创建、怎么索引、怎么变换形状实际需求会推动你进一步理解背后的物理含义。用图片举例一张灰度图是二维张量高×宽一张彩色图是三维张量高×宽×通道一批彩色图片再加上批量维度就是四维张量批量×高×宽×通道。视频则再加时间维变成五维。这种维度递推关系是理解张量的关键路径。4.2 张量的形状从“几行几列”到“每个维度有多大”每个张量都有一个“形状”写成一串整数。一维向量形如(3,)、二维矩阵形如(3,4)、三维张量形如(2,3,4)。形状中每个数字代表该维度上的大小从左到右对应最外层到最内层。我常常把形状理解为“层叠结构”三维张量可以想象成若干矩阵叠在一起四维张量则是若干三维张量叠成一组。操作时你要时刻清楚自己在“哪个维度”上做处理。import numpy as np # 创建一个形状为(2,3,4)的三维张量 t np.random.rand(2, 3, 4) print(t.shape) # (2, 3, 4) print(t.ndim) # 3这里的t可以理解为“2个形状为(3,4)的矩阵叠在一起”。如果你要读取第一个矩阵第二行第三个元素下标写法是t[0, 1, 2]。索引顺序和形状一一对应从最外层开始。4.3 张量的索引与切片位置感比计算重要张量的每一个维度对应一个索引索引从0开始。切片操作则是根据范围截取子张量规则与一维数组相似但维度更多后要更加留心。我一开始总是搞混shape和索引维度后来养成一个习惯拿到任何一个张量先打印shape再逐维观察确认每个下标到底操作的是哪一维。这习惯帮我避免了很多低级错误。import numpy as np t np.array([ [[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]] ]) # 形状是(2,2,3) print(t.shape) # 取第一个二维矩阵中的第二行 print(t[0, 1, :]) # [4 5 6] # 取所有矩阵的最后一列 print(t[:, :, -1]) # [[3 6] # [9 12]]4.4 张量变形与广播两个极高效率的工具变形reshape是指改变张量的形状而不改变数据的总数量以及数据本身。比如一个形状为(6,)的向量可以变形成(2,3)或(3,2)。变换规则是按顺序填充不会打乱数据。广播是指两个形状不完全一致的张量进行运算时会自动把较小的形状扩展到匹配的形状。比如一个形状为(3,1)的矩阵和一个形状为(3,)的向量相加计算库会自动扩展后者从而得到形状为(3,3)的结果。广播机制一开始学习会有点绕但它是处理不同尺寸数据时的利器。我需要提醒的是广播虽然方便但很容易带来“隐含的维度扩展”导致结果与预期不符调试时要格外注意形状变化。import numpy as np A np.array([[1], [2], [3]]) # 形状(3,1) B np.array([10, 20, 30]) # 形状(3,) C A B # 广播后得到(3,3) print(C) # [[11 21 31] # [12 22 32] # [13 23 33]]4.5 张量的“轴”与“归约”为什么求和要指定维度张量求和时可以沿着某个轴求和。比如一个矩阵沿轴0求和相当于把每一列对应行相加沿轴1求和相当于把每一行对应列相加。指定维度可以精确控制“压缩”哪些维度。我用一句话概括轴就是“把张量折叠的方向”。折叠哪个轴哪个轴就消失其余维度保持不变。在实际操作中如果不指定轴通常会全部元素加起来变成一个标量这时措手不及的情况很常见。import numpy as np t np.array([[1, 2, 3], [4, 5, 6]]) print(t.sum(axis0)) # 沿轴0求和[5 7 9] print(t.sum(axis1)) # 沿轴1求和[6 15]理解轴的含义是所有张量操作的关键因为很多高级操作、批量归一化、矩阵乘法以及神经网络里的各种运算最终都要落实到轴的处理上。4.6 张量在工程中的典型应用不只是算法在图像处理中一个批次的彩色图片可以表示为四维张量(批量大小, 高度, 宽度, 通道数)。在网络通信中一批文本可以表示为(批量大小, 序列长度, 特征维度)。张量在物理中表示应力、应变、电场等。这些场景共同之处在于它们都要求数据具有“有序的多维结构”而张量恰好提供了统一的操作语言。如果你所在的工作涉及数据分析、机器学习、图像处理、信号处理等领域掌握张量的基础操作就像掌握一门通用语言很多工具库的API设计都围绕张量来展开。5. 实操笔记从手算到用代码验证的完整流程5.1 准备一个模拟数据以一组成绩为例为了把上面的概念串起来我设计一个模拟场景某校一个小组有4位同学每位同学测了3门科目各得到两组成绩期中成绩和期末成绩。我想用向量和张量来分析成绩变化。期中成绩矩阵4人×3科表示为期中 [[82, 75, 90], [88, 79, 84], [91, 85, 80], [76, 92, 78]]期末成绩矩阵4人×3科期末 [[85, 78, 88], [90, 82, 86], [88, 88, 82], [80, 90, 85]]可以把这两个矩阵叠在一起形成形状为(2,4,3)的三维张量其中第一维是“考试阶段”第二维是“学生”第三维是“科目”。5.2 手算一个张量求和把概念落地我想求每位学生每门科目的成绩之和也就是把期中与期末成绩加起来。因为两个矩阵形状相同(4,3)直接逐元素相加即可得到总分矩阵。手算时先从左上角开始期中[0][0]82期末[0][0]85相加得167然后继续一行一行加。这就是加法规则在二维数据上的自然推广相同位置相加不改变形状。如果要在代码中一步完成可以先创建三维张量再沿“考试阶段”维度求和import numpy as np midterm np.array([[82, 75, 90], [88, 79, 84], [91, 85, 80], [76, 92, 78]]) final np.array([[85, 78, 88], [90, 82, 86], [88, 88, 82], [80, 90, 85]]) scores np.stack([midterm, final], axis0) print(scores.shape) # (2, 4, 3) total scores.sum(axis0) print(total) # [[167 153 178] # [178 161 170] # [179 173 162] # [156 182 163]]这里axis0表示按“考试阶段”这个轴求和操作后第一维消失得到(4,3)的总分矩阵。这个操作在手算时就是逐元素相加在代码中则是沿轴归约。5.3 计算平均分与单位化综合运用向量操作还可以用张量运算计算每位同学的“总平均分”和“各科平均分”。沿axis1学生维度求平均可以得到每门科目在4位同学中的平均成绩沿axis2科目维度求平均可以得到每位同学三门课程的平均成绩。科目平均 total.mean(axis0) # 对4位同学取平均得到每科平均 同学平均 total.mean(axis1) # 对3门科目取平均得到每人平均单位化也很容易实现把总分矩阵的每一行某位同学三门课总分先求模长再逐元素除以模长就得到该同学成绩向量的方向。这里的“方向”可以理解成各科成绩的相对结构与总分的多少无关。norms np.linalg.norm(total, axis1, keepdimsTrue) normalized total / norms print(normalized)归一化后的矩阵每一行模长都是1可以用来比较不同同学的“学科偏向”是否相似而不受整体成绩高低影响。这就是前面讲的“丢掉模长、保留方向”的实际应用。5.4 我自己的调试习惯先检查形状再做运算这部分想分享一个在实际操作中总结出的习惯。每次处理张量我的第一步永远是查看shape和dtype确认数据类型以及每个维度的含义。第二步是做一个小切片测试只取一部分数据跑一遍运算验证逻辑是否按预期工作。第三步才是全量计算。这样做最大的好处是定位问题快。举个例子有一次我用广播机制处理形状不匹配的数组没有先测试结果计算完成后发现某些位置的值完全不符合预期。后来我检查了shape发现广播把某些维度“静默扩展”了虽然没报错但语义已经变了。先做小规模测试能避免这类问题。实操心得对张量操作不要只想“能不能算”还要问“算得对不对”。代码不报错不等于结果正确形状和语义匹配往往比运算本身更容易出错。6. 常见误区与排查思路把我踩过的坑直接告诉你6.1 误区一把行向量与列向量当成一回事行向量形状是(1, n)列向量形状是(n, 1)但形状为(n,)的一维数组与两者都不同。很多初学者以为一维数组就是行向量或列向量其实它在数学上更接近一个“无方向”的向量。实际影响出现在做矩阵乘法时一个(1, 3)乘(3, 1)得到(1,1)的标量而(3,)乘(3,)得到的是一个标量计算库可能实现不同的逻辑。我建议在需要区分行列时显式把向量reshape成(1, n)或(n, 1)避免歧义。import numpy as np v np.array([1, 2, 3]) # 形状(3,) row v.reshape(1, 3) # 形状(1, 3) col v.reshape(3, 1) # 形状(3, 1)6.2 误区二矩阵乘法里的维数对不上就“强行算”有时你会遇到两个矩阵维度并不匹配但数据逻辑上就要相乘。这时候需要先做转置、reshape或者交换操作确保中间维度对齐。切忌为了让计算通过而随意交换维度顺序那样得到的结果完全不是想要的。我的建议是先在纸上画一画维度矩阵左矩阵行数、列数右矩阵行数、列数标出中间维度是否相等结果矩阵的预期形状。这样比在代码里反复试错快得多。6.3 误区三忽略轴的顺序张量是“按顺序嵌套”的结构轴的顺序直接决定数据的语义。例如形状(批量, 高度, 宽度, 通道)和(批量, 通道, 高度, 宽度)虽然只差一个维度位置但表示的含义完全不同。很多库之间数据格式不兼容就是因为轴的顺序约定不同。我实战中经常需要做轴交换如把(批量, 高度, 宽度, 通道)转为(批量, 通道, 高度, 宽度)这时可以用transpose显式指定新顺序。每次操作后都要再次打印shape确认没有意外。import numpy as np img np.random.rand(4, 32, 32, 3) # 批量4高32宽32通道3 img_t np.transpose(img, (0, 3, 1, 2)) print(img_t.shape) # (4, 3, 32, 32)6.4 误区四广播机制用了但不知道它在发生广播机制很强大但它隐藏了维度扩展的过程。当两个形状不同的数组做运算时计算库会自动补齐维度用户往往以为自己在操作一维向量实际上结果已经是高维张量。我的习惯是在关键运算前打印两个操作数的shape确认它们是否匹配。如果发现广播在起作用先想清楚“扩展的是哪一维”再继续。这个习惯帮我少踩了很多坑。6.5 常见问题排查速查表问题现象可能原因排查方法矩阵乘法报维度错误左列数不等于右行数打印两个矩阵shape调整维度顺序或做转置结果形状不符合预期轴的顺序理解有误逐维打印确认每个轴对应的语义求和/均值结果是一个数而不是期望矩阵忘记指定axis按需求指定axis0/1/2广播导致数值异常形状匹配但不合理扩展打印shape确认广播方向是否符合预期转置后数据错乱行列互换导致的语义变化先做小规模数据测试观察转置前后数据7. 给零基础朋友的三条实操建议7.1 先用手算小例子找感觉不要一上来就写大段代码。找一个小矩阵比如2行3列手动算一次加法、一次乘法再对照代码输出结果这样对“逐元素操作”和“行乘列”的理解会更扎实。我教过不少初学者发现凡是愿意手算一遍的人后续代码出错率低很多。7.2 用打印输出代替“脑中想象”面对多维张量大脑很难直接想象出它的样子。最有效的方式是打印shape再打印一小块数据例如t[:1, :2, :3]观察数据是怎么排列的。反复几次就能建立起“轴”与“数据排列”的对应感觉。7.3 学会读报错信息里的shape计算库的报错信息往往直接告诉你“形状不匹配预期(3,4)实际得到(4,3)”。不要忽略这些提示它们已经指明了问题方向。比起反复猜测按报错去调整维度更快。我个人在实际操作中的体会是向量与张量的门槛不在于公式有多难而在于脑子里有没有建立“按维度组织数据、按轴执行操作”的思维框架。一旦这个框架建立起来后面再接触更复杂的数学工具会顺畅得多。最后再分享一个小技巧在纸上给张量画“盒子图”非常有效——每个维度画一层方框标好尺寸遇到复杂操作就往图里填数据。这个方法帮我解决了无数次轴顺序的困惑你也可以试试。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询