Pytorch基础-tensor数据结构
- 回答。
样例代码如下:
matrix = torch.tensor([[[1,2,3,4],[5,6,7,8]], [[5,4,6,7], [5,6,8,9]]], dtype = torch.float64) print(matrix) # 打印 tensor print(matrix.dtype) # 打印 tensor 数据类型 print(matrix.dim()) # 打印 tensor 维度 print(matrix.size()) # 打印 tensor 尺寸 print(matrix.shape) # 打印 tensor 尺寸 matrix2 = matrix.view(4, 2, 2) # 改变 tensor 尺寸 print(matrix2)程序输出结果如下:
view 和 reshape 的区别
- 两个方法都是用来改变 tensor 的 shape,view() 只适合对满足连续性条件(
contiguous)的 tensor 进行操作,而 reshape() 同时还可以对不满足连续性条件的 tensor 进行操作。 - 在满足 tensor 连续性条件(
contiguous)时,a.reshape() 返回的结果与a.view() 相同,都不会开辟新内存空间;不满足contiguous时, 直接使用 view() 方法会失败,reshape()依然有用,但是会重新开辟内存空间,不与之前的 tensor 共享内存,即返回的是 ”副本“(等价于先调用contiguous()方法再使用view()方法)。
更多理解参考这篇文章
Tensor 与 ndarray
1,张量和 numpy 数组。可以用
.numpy()方法从 Tensor 得到 numpy 数组,也可以用torch.from_numpy从 numpy 数组得到Tensor。这两种方法关联的 Tensor 和 numpy 数组是共享数据内存的。可以用张量的clone方法拷贝张量,中断这种关联。arr = np.random.rand(4,5) print(type(arr)) tensor1 = torch.from_numpy(arr) print(type(tensor1)) arr1 = tensor1.numpy() print(type(arr1)) """""" 2,
item()方法和tolist()方法可以将张量转换成 Python 数值和数值列表# item方法和tolist方法可以将张量转换成Python数值和数值列表 scalar = torch.tensor(5) # 标量 s = scalar.item() print(s) print(type(s)) tensor = torch.rand(3,2) # 矩阵 t = tensor.tolist() print(t) print(type(t)) """ 1.0[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]] """ 创建 Tensor
创建 tensor ,可以传入数据或者维度,torch.tensor() 方法只能传入数据,torch.Tensor() 方法既可以传入数据也可以传维度,强烈建议 tensor() 传数据,Tensor() 传维度,否则易搞混。
传入维度的方法
方法名 方法功能 备注 torch.rand(*sizes, out=None) → Tensor返回一个张量,包含了从区间 [0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。推荐 torch.randn(*sizes, out=None) → Tensor返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。 不推荐 torch.normal(means, std, out=None) → Tensor返回一个张量,包含了从指定均值 means和标准差std的离散正态分布中抽取的一组随机数。标准差std是一个张量,包含每个输出元素相关的正态分布标准差。多种形式,建议看源码 torch.rand_like(a)根据数据 a的 shape 来生成随机数据不常用 torch.randint(low=0, high, size)生成指定范围( low, hight)和size的随机整数数据常用 torch.full([2, 2], 4)生成给定维度,全部数据相等的数据 不常用 torch.arange(start=0, end, step=1, *, out=None)生成指定间隔的数据 易用常用 torch.ones(*size, *, out=None)生成给定 size 且值全为1 的矩阵数据 简单 zeros()/zeros_like()/eye()全 0的 tensor 和 对角矩阵简单 样例代码:
>>> torch.rand([1,1,3,3]) tensor([[[[0.3005, 0.6891, 0.4628], [0.4808, 0.8968, 0.5237], [0.4417, 0.2479, 0.0175]]]]) >>> torch.normal(2, 3, size=(1, 4)) tensor([[3.6851, 3.2853, 1.8538, 3.5181]]) >>> torch.full([2, 2], 4) tensor([[4, 4], [4, 4]]) >>> torch.arange(0,10,2) tensor([0, 2, 4, 6, 8]) >>> torch.eye(3,3) tensor([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])参考资料
- PyTorch:view() 与 reshape() 区别详解
- torch.rand和torch.randn和torch.normal和linespace()
- 两个方法都是用来改变 tensor 的 shape,view() 只适合对满足连续性条件(