您好,登录后才能下订单哦!
今天小编给大家分享一下numpy和torch.tensor的张量操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
np.concatenate((a1,a2,a3,…), axis=0)
张量的拼接要用np.concatenate这个方法的,其中 a1,a2,a3,…是拼接的子张量,axis是维数,axis=0表示按照第一维进行拼接。
例如将两个二维的张量按照第一维拼接成一个二维的张量:
import numpy as np a=np.array([[1,2,3]]) b=np.array([[4,5,6]]) c=np.concatenate((a,b),axis=0) print(c) d=np.concatenate((c,a),axis=0) print(d) e=np.concatenate((c,c),axis=1) print(e)
结果
array([[1, 2, 3],
[4, 5, 6]])
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3]])
array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
对于axis选择的更简单直接的理解是我们可以从将被拼接的两个矩阵的形状上来看,比如
a.shape=(3,1,2), b.shape=(6,1,2),则我们对其进行拼接的话目的是让拼接之后的shape=(9,1,2),那么我们就选择axis=0,即代表对第0维的进行相加。
代码如下:
import numpy as np a = np.zeros((3, 1, 2)) b = np.zeros((6, 1, 2)) c = np.concatenate((a, b), axis=0) print(c.shape)
结果为:
(9, 1, 2)
这里的拼接和上面介绍的numpy的拼接功能是一样的
C = torch.cat( (A,B),0 ) #按维数0拼接(竖着拼) C = torch.cat( (A,B),1 ) #按维数1拼接(横着拼)
例:
import torch A=torch.ones(2,3) #2x3的张量(矩阵) B=2*torch.ones(4,3) #4x3的张量(矩阵) C=torch.cat((A,B),0) #按维数0(行)拼接 print(C)
结果:
tensor([[ 2., 2., 2.],
[ 2., 2., 2.],
[ 2., 2., 2.],
[ 2., 2., 2.]])
接着上面
D=2*torch.ones(2,4) #2x4的张量(矩阵) C=torch.cat((A,D),1)#按维数1(列)拼接 print(C)
结果:
tensor([[ 1., 1., 1., 2., 2., 2., 2.],
[ 1., 1., 1., 2., 2., 2., 2.]])
>>> import numpy as np >>> a = np.array([[1,2,3],[4,5,6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> b = np.reshape(a, (2,3,1)) >>> b array([[[1], [2], [3]], [[4], [5], [6]]]) >>> b.shape (2, 3, 1)
>>> import numpy as np >>> a = np.array([1,2,3,4,5,6,7,8]) >>> a.shape = (2, 4) >>> a array([[1, 2, 3, 4], [5, 6, 7, 8]])
在pytorch中view函数的作用为重构张量的维度,相当于numpy中resize()的功能,但是用法可能不太一样。
1.torch.view(参数a,参数b,…)
例如:
import torch tt1=torch.tensor([-0.3623, -0.6115, 0.7283, 0.4699, 2.3261, 0.1599]) result=tt1.view(3,2) print(result)
结果
tensor([[-0.3623, -0.6115],
[ 0.7283, 0.4699],
[ 2.3261, 0.1599]])
在上面例子中参数a=3和参数b=2决定了将一维的tt1重构成3x2维的张量。
2.有的时候会出现torch.view(-1)或者torch.view(参数a,-1)这种情况。
例:
import torch tt2=torch.tensor([[-0.3623, -0.6115], [ 0.7283, 0.4699], [ 2.3261, 0.1599]]) result=tt2.view(-1) print(result)
结果:
tensor([-0.3623, -0.6115, 0.7283, 0.4699, 2.3261, 0.1599])
由上面的案例可以看到,如果是torch.view(-1),则原张量会变成一维的结构。
例:
import torch tt3=torch.tensor([[-0.3623, -0.6115], [ 0.7283, 0.4699], [ 2.3261, 0.1599]]) >>> result=tt3.view(2,-1)
结果:
tensor([[-0.3623, -0.6115, 0.7283],
[ 0.4699, 2.3261, 0.1599]])
由上面的案例可以看到,如果是torch.view(参数a,-1),则表示在参数b未知,参数a已知的情况下自动补齐列向量长度,在这个例子中a=2,tt3总共由6个元素,则b=6/2=3。
例:
import torch inputs = torch.randn(1,3) print(inputs) print(inputs.view(1, 1, -1))
结果:
tensor([[-0.5525, 0.6355, -0.3968]])
tensor([[[-0.5525, 0.6355, -0.3968]]])
将二维变为三维,a=1,b=1,c=3/(1*1)
import torch inputs = torch.randn(1,3) print(inputs.size())
结果:
torch.Size([1, 3])
用unsqueeze方法将原张量进行维度扩张,unsqueeze后面括号里的数字代表在哪个维度扩张
import torch a = torch.tensor([[1, 2, 3], [4, 5, 6]]) b = torch.tensor([[7, 8, 9], [4, 5, 6]]) print(a) print(b) a = a.unsqueeze(0) b = b.unsqueeze(0) print(a) print(b) c = torch.cat((a, b), 0) print(c) print(c.shape)
结果为
tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[7, 8, 9],
[4, 5, 6]])
tensor([[[1, 2, 3],
[4, 5, 6]]])
tensor([[[7, 8, 9],
[4, 5, 6]]])
tensor([[[1, 2, 3],
[4, 5, 6]],[[7, 8, 9],
[4, 5, 6]]])
torch.Size([2, 2, 3])
用squeeze方法将原张量进行维度缩减,squeeze后面括号里的数字代表在哪个维度缩减
import torch a = torch.tensor([[1, 2, 3], [4, 5, 6]]) b = torch.tensor([[7, 8, 9], [4, 5, 6]]) print(a) print(b) a = a.unsqueeze(0) b = b.unsqueeze(0) print(a) print(b) a = a.squeeze(0) b = b.squeeze(0) print(a) print(b)
结果为
tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[7, 8, 9],
[4, 5, 6]])
tensor([[[1, 2, 3],
[4, 5, 6]]])
tensor([[[7, 8, 9],
[4, 5, 6]]])
tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[7, 8, 9],
[4, 5, 6]])
np.expand_dims:用于扩展数组的形状
原始数组:
import numpy as np In [12]: a = np.array([[[1,2,3],[4,5,6]]]) a.shape Out[12]: (1, 2, 3)
np.expand_dims(a, axis=0)表示在0位置添加数据,转换结果如下:
In [13]:
b = np.expand_dims(a, axis=0)
b
Out[13]:
array([[[[1, 2, 3],
[4, 5, 6]]]])
In [14]:
b.shape
Out[14]:
(1, 1, 2, 3)
以上就是“numpy和torch.tensor的张量操作方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。