可以参照其他两篇博客:
pytorch_tensor
python基础之一_集合数据类型
一 python、numpy、pytorch中多维数组操作
总结:
- python中无法直接对多维数组切片;numpy、pytorch可以;
- numpy、pytorch中数组切片操作相同;
1.1 tensor、ndarray、list的区别
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既然表示一个矩阵,也就要求形状是固定的,且是一开始就定好的。
1.2 实现
ls1=[[1,2,3],[4,5,6]]
ls2=np.array(ls)
ls3=torch.tensor(ls2)
输出1:---------------------
print(ls[:,2])
print(ls2[:,2])
print(ls3[:,2])
输出2:---------------------
print(ls1[...])
print(ls2[.