可以参照其他两篇博客: pytorch_tensor python基础之一_集合数据类型
总结:
python中无法直接对多维数组切片;numpy、pytorch可以;numpy、pytorch中数组切片操作相同;tensor、ndarray、list的什么区别,为什要有这么多类似的结构?
list是python中的数据结构,ndarray是numpy包中的数据结构,tensor是torch包中的数据结构 list表示集合(容器)、ndarray表示矩阵、tensor表示张量;ndarray和tensor区别不大,tensor可以看做是ndarray的改进版,专门为了使用GPU加速计算。tensor可用GPU加速,ndarray不能。其他的API类似,总得来说都是为了表示矩阵,ndarray是只能在CPU上运算的矩阵,tensor是在CPU、GPU上都能运算的矩阵。 与此特性相对应,tensor主要是为了在需要GPU计算的场合使用,也就是模型要训练的参数。而ndarray则是在与除此之外的场合使用,例如:数据预处理。 那能够用tensor代替ndarray吗?至少在自己写的代码中是可以的,tensor可以当做ndarray使用。但是,很多与数据处理相关的第三方包返回的都是ndarray。另外,感觉ndarray对比tensor是一种更基本的数据结构,除了深度学习以外还有很多其他科学计算任务中,在这些任务中显然也需要矩阵,他们里面应该都是使用的ndarray。ndarry和list区别很大,ndarray是数学中矩阵在python中的表示,因此严格符合矩阵的各种约束,而list只是表示一个容器,其结构宽松得多。例如,矩阵形状肯定是符合 X*Y这种格式的,因此各分量长度自然相等,而且各分量类型自然相同。list中就没有这种要求,list的各分量类型和长度都可以不同,list自然也没有shape这种概念。 二者的类似之处,只在于有相同的访问方式,都能通过下标访问。 另外,ndarray既然表示一个矩阵,也就要求形状是固定的,且是一开始就定好的。https://www.runoob.com/numpy/numpy-array-manipulation.html https://blog.csdn.net/Babyfatliang/article/details/87721282
高维数组切片: https://www.cnblogs.com/mengxiaoleng/p/11616869.html 数组中的省略号: https://blog.csdn.net/weixin_41637329/article/details/88362345 https://blog.csdn.net/qq_33363973/article/details/79894982
出于对“三维数组的[…,2]是二维”这一现象的不理解,进行以下试验:
a=np.array([[[1,2,12],[3,4,34]],[[5,6,56],[7,8,78]]]) print(a.shape) print(a[:,1,:]) print(a[:,:,1]) print(a[...,1:2]) print(a[...,1]) 输出1:--------------------- (2, 2, 3) 输出2:--------------------- [[ 3 4 34] [ 7 8 78]] 输出3:--------------------- [[2 4] [6 8]] 输出4:--------------------- [[[2] [4]] [[6] [8]]] 输出5:--------------------- [[2 4] [6 8]]结果分析: 1.由输出2和3可以发现:高维数组中用单个数字索引时,结果中该维度长度为1,且结果被squeeze; 2.由输出3和4可以发现:高维数组中用范围索引时,即使结果中该维度长度为1,结果也不会别squeeze; 3.由输出3和5可以发现:省略号就是一个占位符,表示前面的维度全范围。
注意: 回过头来看,结论1和2多余甚至有谬误,起因是对高维矩阵无法直观认识。 数组用单个数字索引访问时,是取元素,返回的是元素值,在这一级上并不是数组,自然不带外层的中括号,也就是访问元素必然导致维度降低一级。而用索引返回访问时,是取数组的切片,返回的是数组,取切片不会导致维度下降。其实,这就是“1”和“[1]”的区别,只不过在高维数组中不像二维中那么直观。
ls=[1,2,3] print(ls[1]) print(ls[1:2]) 输出1:--------------------- 2 输出1:--------------------- [2] a=np.array([[[1,2,12],[3,4,34]],[[5,6,56],[7,8,78]]]) print(a[0]) print(a[0,:,:]) 输出1:--------------------- [[ 1 2 12] [ 3 4 34]] 输出2:--------------------- [[ 1 2 12] [ 3 4 34]] 如上,操作二维数组或者高维数组的第一维,结果就很直观http://30daydo.com/article/467
https://blog.csdn.net/lwgkzl/article/details/79136053