终极Pyfa船舰装配工具:3个步骤快速提升EVE Online游戏胜率
2026/5/26 23:18:48
作为初学者,我们先从核心概念拆解开始,用最通俗的语言讲清楚「广播」和「不规则张量(RaggedTensor)」,再一步步拆解每个示例的计算过程,最后总结规律。
张量的维度数 = 嵌套括号的层数(最外层算1层):
3):0维(无括号)[1,2]):1维(1层括号)[[1,2],[3]]):2维(2层括号)[[[1,2],[3,4]],[[5,6]]]):3维(3层括号)普通张量的每一行元素个数必须相同(比如[[1,2],[3,4]]),但RaggedTensor允许每行元素个数不同(比如[[1,2],[3]],第一行2个、第二行1个),这是理解示例的关键。
逐元素运算(加减乘除)要求两个张量的「每个位置都能一一对应」,但实际中张量形状可能不同。广播就是把形状小的张量「复制扩展」,让它和大张量形状兼容,从而能逐元素运算。
把官方规则翻译成新手能懂的话:
如果两个张量维度数不一样,给「维度少的那个」的最外层加维度(大小为1),直到两者维度数相同。
👉 比如:标量3(0维)和二维RaggedTensor[[1,2],[3]](2维),先把标量补成[[3]](2维,大小1×1),维度数就匹配了。
对每一个维度,检查两个张量的「大小」:
👉 关键:只有「大小为1的维度」能被复制扩展,否则必报错!
x=tf.ragged.constant([[1,2],[3]])# 2维RaggedTensor,形状:2 × (不规则)(第一维2行,第二行分别是2个、1个)y=3# 0维标量print(x+y)# 结果:<tf.RaggedTensor [[4, 5], [6]]>[[3]](2维,大小1×1)。[[3],[3]];[[3,3],[3]];1+3=4,2+3=5→[4,5];3+3=6→[6]。x=tf.ragged.constant([[10,87,12],[19,53],[12,32]])# 2维,形状3×(不规则)(3行,元素数3、2、2)y=[[1000],[2000],[3000]]# 2维普通张量,形状3×1(3行,每行1个)print(x+y)# 结果:<tf.RaggedTensor [[1010, 1087, 1012], [2019, 2053], [3012, 3032]]>[[1000,1000,1000],[2000,2000],[3000,3000]];10+1000=1010,87+1000=1087,12+1000=1012;19+2000=2019,53+2000=2053;12+3000=3012,32+3000=3032。x=tf.ragged.constant([[[1,2],[3,4],[5,6]],[[7,8]]],ragged_rank=1)# 3维,形状2×(不规则)×2(2组,第一组3个子集,第二组1个;每个子集2个元素)y=tf.constant([[10]])# 2维,形状1×1print(x+y)# 结果:<tf.RaggedTensor [[[11, 12],[13, 14],[15, 16]], [[17, 18]]]>[[[10]]](3维,大小1×1×1)。[[[10]], [[10]]];[[[10],[10],[10]], [[10]]];[[[10,10],[10,10],[10,10]], [[10,10]]];1+10=11/2+10=12,3+10=13/4+10=14,5+10=15/6+10=16;7+10=17/8+10=18。x=tf.ragged.constant([[[[1],[2]],[],[[3]],[[4]]],[[[5],[6]],[[7]]]],ragged_rank=2)# 4维,形状2×(不规则)×(不规则)×1(2组,第一组4个子集,第二组2个;子集内元素数不规则;每个元素1个值)y=tf.constant([10,20,30])# 1维,形状3print(x+y)# 结果:<tf.RaggedTensor [[[[11,21,31],[12,22,32]], [], [[13,23,33]], [[14,24,34]]], [[[15,25,35],[16,26,36]], [[17,27,37]]]]>[[[[10,20,30]]]](4维,大小1×1×1×3)。[1])复制成3个值([1,1,1]);1+10=11/1+20=21/1+30=31→[11,21,31];2+10=12/2+20=22/2+30=32→[12,22,32];x=tf.ragged.constant([[1,2],[3,4,5,6],[7]])# 2维,形状3×(2、4、1)y=tf.constant([[1,2,3,4],[5,6,7,8],[9,10,11,12]])# 2维,形状3×4# x + y 报错x=tf.ragged.constant([[1,2,3],[4],[5,6]])# 2维,形状3×(3、1、2)y=tf.ragged.constant([[10,20],[30,40],[50]])# 2维,形状3×(2、2、1)# x + y 报错x=tf.ragged.constant([[[1,2],[3,4],[5,6]],[[7,8],[9,10]]])# 3维,形状2×(3、2)×2y=tf.ragged.constant([[[1,2,0],[3,4,0],[5,6,0]],[[7,8,0],[9,10,0]]])# 3维,形状2×(3、2)×3# x + y 报错[[3]],不是[3,];记住这4条,再回头看示例,就能清晰理解每一步的计算逻辑了。