1ellipsis
三个点在python中的类别名称叫做ellipsis,中文意思就是省略号。
type(...)
<class 'ellipsis'>
2 ellipsis在Numpy或者tensor中的应用
以pytorch中的tensor格式为例。先随机生成一个(4,3,4)尺寸的tensor。
import torch
a = torch.randn(4, 3, 4) # 随机生成一个(4,3,4)尺寸的tensor
print(a)
tensor([[[-1.0691, 1.1035, 1.1393, -0.2697],
[ 0.7714, -0.8335, -1.3316, 1.6003],
[-1.3023, 0.0086, 1.2506, -1.3495]],
[[ 1.1887, 1.2299, -2.3907, -0.9398],
[ 0.7684, -0.5810, 1.0292, -0.4403],
[ 0.0410, -1.3440, 0.6224, 2.3383]],
[[ 0.3019, -0.5783, 0.4214, -0.5811],
[-1.7942, -0.8230, -0.9545, -0.9520],
[ 0.4636, -0.6919, -0.4382, 0.6298]],
[[-0.1962, -0.0933, -0.3654, -1.3060],
[-0.0212, 0.7255, -2.2106, -0.3655],
[ 0.1591, -0.5504, -1.0143, -1.7478]]])
print(a[..., :2])
tensor([[[-1.0691, 1.1035],
[ 0.7714, -0.8335],
[-1.3023, 0.0086]],
[[ 1.1887, 1.2299],
[ 0.7684, -0.5810],
[ 0.0410, -1.3440]],
[[ 0.3019, -0.5783],
[-1.7942, -0.8230],
[ 0.4636, -0.6919]],
[[-0.1962, -0.0933],
[-0.0212, 0.7255],
[ 0.1591, -0.5504]]])
我们可以发现,a[…, :2]的输出就是前两个维度取所有,第三个维度只取前两列,可以推测出…的作用是代表取逗号前面的所有维度。
假设共n个维度,也就是如果后边有一个逗号分隔,则…是取前n-1个维度的所有。如果没有逗号分隔,则…是取所有维度的元素,也就和这个tensor本身没有任何区别。
结论:
…取的维度 = 所有维度 - 逗号个数
即a[…, :2]= a[:, :, :2]
2.1验证
print((a[...]= a).all())
tensor(True)
print((a[..., :2]= a[:, :, :2]).all())
tensor(True)