PyTorch一维张量shape属性返回行为与多维张量的差异问题
PyTorch张量
shape属性行为差异说明 这个行为差异和PyTorch的shape属性本身逻辑无关,完全是Python基础赋值、解包语法规则导致的。
核心本质:shape的返回值规则
t.shape永远返回torch.Size类型的对象,这个类是Python原生元组(tuple)的子类,行为和元组完全一致:
- 张量有多少个维度,
torch.Size里就包含多少个对应维度长度的元素 - 它始终是一个序列对象,从来不会因为张量维度少就直接返回单个数值
二维张量场景的原理解释
对于形状为[3,2]的二维张量,t.shape得到的是长度为2的torch.Size序列,等价于元组(3, 2)。
你写N, M = t.shape时,触发了Python的可迭代对象解包逻辑:等号右边的序列有2个元素,等号左边刚好写了2个变量,Python会自动把序列里的元素按顺序赋值给对应变量,最终得到N=3、M=2。
注意:这个过程里
shape本身没有返回两个单独的数值,你拿到两个独立整数是解包语法的作用,不是shape的特殊行为。
一维张量场景的原理解释
对于形状为[3]的一维张量,t.shape得到的是长度为1的torch.Size序列,等价于元组(3,)。
你写X = t.shape时,等号左边只有1个变量,不会触发解包逻辑,Python会把整个torch.Size序列对象直接赋值给X,自然得到torch.Size([3]),而不是序列内部存储的数值3。
如果想拿到数值3,有两种等价写法:
- 索引取值:
X = t.shape[0],即取出长度为1的序列里的第0个元素 - 单元素解包:
X, = t.shape(注意X后面的逗号),显式告诉Python你要对长度为1的序列做解包,同样可以直接拿到数值3
行为对比(原生Python元组)
torch.Size的行为和Python原生元组完全一致,可以用原生代码复现你观察到的所有现象:
# 对应二维张量场景 two_dim_shape = (3, 2) N, M = two_dim_shape print(N) # 3 print(M) # 2 print(two_dim_shape) # (3, 2) # 对应一维张量场景 one_dim_shape = (3,) X = one_dim_shape print(X) # (3,) X = one_dim_shape[0] print(X) # 3 X, = one_dim_shape print(X) # 3
内容的提问来源于stack exchange,提问作者melatonin15
相关产品推荐
相关产品推荐

