pytorch

    技术2022-07-31  79

    可以参照其他两篇博客: 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[...]) print(ls3[...]) 输出1--------------------- Error: TypeError: list indices must be integers or slices, not tuple [3,6] tensor([3,6]) 输出2--------------------- Error: TypeError: list indices must be integers or slices, not ellipsis [[1 2 3] [4 5 6]] tensor([[1, 2, 3], [4, 5, 6]])

    https://www.runoob.com/numpy/numpy-array-manipulation.html https://blog.csdn.net/Babyfatliang/article/details/87721282

    二 numpy高维数组切片和省略号

    高维数组切片: 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]] 如上,操作二维数组或者高维数组的第一维,结果就很直观

    三 axis轴的索引

    http://30daydo.com/article/467

    四 二维数组取元素

    https://blog.csdn.net/lwgkzl/article/details/79136053

    Processed: 0.015, SQL: 9