PyTorch中的Tensor基本操作总结

Tensor是PyTorch 存储数据的基本单元, 数据都是存储在tensor中然后进行运算的. 本文总结 PyTorch中tensor的一些基本操作. 包括: 1, 创建tensor. 2, 改变Tensor中数据的type和shape. 3, tensor间的基本运算.

创建tensor

In [1]: import torch
In [2]: import numpy as np

从 int list中创建
In [3]: a = [1,2,3]
In [4]: t_a = torch.tensor(a)
In [5]: print(t_a)
tensor([1, 2, 3])

从numpy array中创建
In [6]: b = np.array([1, 2, 3, 4], dtype=np.int32)
In [7]: t_b = torch.from_numpy(b)
In [8]: print(t_b)
tensor([1, 2, 3, 4], dtype=torch.int32)

直接创建ones矩阵
In [9]: t_c = torch.ones(3,3)
In [10]: print(t_c)
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

直接创建随机矩阵范围 [0,1)
In [11]: t_d = torch.rand(2,3)
In [12]: print(t_d)
tensor([[0.6955, 0.8926, 0.9778],
        [0.3022, 0.4747, 0.9094]])

改变tensor的形状与数据type 

改变tensor内数据的type
In [13]: t_a_new = t_a.to(torch.int64)

In [14]: print(t_a_new.dtype)
torch.int64


改变tensor shape 
In [15]: t = torch.zeros(20)

In [16]: t_reshape = t.reshape(4, 5)

In [17]: print(t_reshape.shape)
torch.Size([4, 5])


tensor转置
In [18]: t = torch.rand(4, 5)

In [19]: t_transpose = torch.transpose(t, 0, 1)

In [23]: print(t.shape, "-->",t_transpose.shape)
torch.Size([4, 5]) --> torch.Size([5, 4])


维度压缩, 消除多余的维度.
In [25]: t = torch.ones(1, 3, 4, 5)

In [26]: t_squeeze = torch.squeeze(t, 0)

In [27]: print(t_squeeze.shape)
torch.Size([3, 4, 5])

tensor中的数学运算


In [30]: t1 = 5 + torch.rand(3, 4) * 2

In [31]: t2 = torch.normal(mean=0, std=1, size=(3, 4))



t1 与t2 点乘(element wise)
In [32]: t3 = torch.multiply(t1, t2)

In [33]: print(t3)
tensor([[ 3.7544,  1.0344, -6.6131,  2.6453],
        [ 0.0394,  8.2370, 12.3229,  3.4751],
        [ 4.4234, 12.7690, -0.9023, -3.5027]])



X乘
In [35]: t4 = torch.torch.matmul(t1, torch.transpose(t2, 0, 1))

In [36]: print(t4)
tensor([[ 0.8210, 23.2943, 11.9209],
        [-0.1248, 24.0745, 13.7630],
        [-1.4852, 26.2885, 12.7874]])




按照某轴的 mean, sum,std运算. 
如: t1是个3行4列 的矩阵
In [37]: print(t1)
tensor([[6.6838, 5.7557, 5.2833, 6.8798],
        [5.5056, 6.8812, 5.3308, 5.7699],
        [5.3363, 6.5976, 6.3740, 6.0077]])

按t1的列计算平均值
In [38]: t5 = torch.mean(t1, axis=0)
In [39]: print(t5)
tensor([5.8419, 6.4115, 5.6627, 6.2191])

按行计算总和:
In [40]: t6 = torch.sum(t1, axis=1)
In [41]: print(t6)
tensor([24.6026, 23.4875, 24.3156])

Tensor的拆分与合并,

拆分

pytorch中常用的tensor拆分方法有:troch.chunk()

In [7]: import torch

In [8]: t_split = torch.chunk(t, 3)

In [9]: [item.numpy() for item in t_split]
Out[9]: 
[array([0.70972687, 0.27158302, 0.60073674], dtype=float32),
 array([0.7532348 , 0.4176404 , 0.36205906], dtype=float32),
 array([0.12663347, 0.7341193 , 0.13570935], dtype=float32)]

torch.chunk(tensor, 整数参数), tensor 中沿着要切的维度的size必须能被后面的参数整除。 如果不能整除,需要用到torch.split() 如: 

In [10]: t = torch.rand(7)

In [11]: t_split = torch.split(t, split_size_or_sections=[4, 3])

In [13]: [item.numpy() for item in t_split]
Out[13]: 
[array([0.8252777 , 0.02960074, 0.1536448 , 0.7550541 ], dtype=float32),
 array([0.29480588, 0.89575726, 0.26591474], dtype=float32)]

合并

两个tensor 沿着某轴的合并,

In [19]: A  = torch.zeros(3, 3)

In [20]: B = torch.ones(3, 3)

In [21]: C = torch.cat([A, B], axis=0)

In [22]: print(C)
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

In [23]: C = torch.cat([A, B], axis=1)

In [24]: print(C)
tensor([[0., 0., 0., 1., 1., 1.],
        [0., 0., 0., 1., 1., 1.],
        [0., 0., 0., 1., 1., 1.]])

参考自:  Machine Learning with PyTorch and Scikit-Learn Book

Tensor views在PyTorch是一种非常有用的操作,它可以让我们对一个Tensor进行不同的视图操作,而不会改变它的数据本身。这个操作可以极大地减少内存的占用,同时也能够提高代码的效率。 在PyTorch,我们可以使用以下方法创建Tensor views: 1. `view()`:这个方法可以改变Tensor的形状,但是新的Tensor必须和原来的Tensor包含相同的元素数目。如果你想要改变Tensor的形状,但是又不想改变Tensor的数据,那么view()方法就是你需要的。 2. `reshape()`:这个方法和view()方法很像,但是它可以改变Tensor的形状,即使新的Tensor和原来的Tensor包含不同数量的元素。如果你想要改变Tensor的形状,同时还想改变Tensor的数据,那么reshape()方法就是你需要的。 3. `narrow()`:这个方法可以让你从一个Tensor选择一个子集,这个子集是一个连续的Tensor。你可以使用这个方法来实现切片操作。 4. `expand()`:这个方法可以让你将一个Tensor扩展成一个更大的Tensor,但是数据并不会被复制。 5. `transpose()`:这个方法可以让你将Tensor的维度交换。 下面是一些具体的操作示例: ```python import torch # 创建一个大小为(2, 3)的Tensor x = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 使用view()方法创建一个视图 y = x.view(6) print(y) # 使用reshape()方法创建一个视图 z = x.reshape(3, 2) print(z) # 使用narrow()方法创建一个视图 w = x.narrow(1, 1, 2) print(w) # 使用expand()方法创建一个视图 u = x.expand(2, 3, 2) print(u) # 使用transpose()方法创建一个视图 v = x.transpose(0, 1) print(v) ``` 输出结果如下: ``` tensor([1, 2, 3, 4, 5, 6]) tensor([[1, 2], [3, 4], [5, 6]]) tensor([[2, 3], [5, 6]]) tensor([[[1, 2], [3, 4], [5, 6]], [[1, 2], [3, 4], [5, 6]]]) tensor([[1, 4], [2, 5], [3, 6]]) ``` 可以看到,我们使用不同的方法创建了不同的Tensor views,并且这些views对原来的Tensor没有任何影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值