[pytorch]常用函数(自用)

一、公共部分

1、torch.linespace

返回一维张量,在start和end之间(包括start也包括end)的均匀间隔的steps个点,长度为steps。

print(torch.linspace(1,10,3))  #输出tensor([ 1.0000,  5.5000, 10.0000])
print(torch.linspace(-10,10,10))  #tensor([-10.0000,  -7.7778,  -5.5556,  -3.3333,  -1.1111,   1.1111,   3.3333, 5.5556,   7.7778,  10.0000])

2、torch.from_array(ndarray)->Tensor

返回的张量和ndarray共享一片存储区域,修改一个会导致另一个的修改。返回的张量不能改变大小

a=np.array([[1,2,3],[4,5,6]])
b=torch.from_numpy(a)
print(b)#输出tensor([[1, 2, 3],
        #[4, 5, 6]], dtype=torch.int32)
b[0][0]=11
print(a)#输出[[11  2  3] #[ 4  5  6]]

3、torch.numel(input)->int

返回tensor中元素的总个数

a=torch.rand(1,2,3,4)
print(torch.numel(a))#输出24

4、torch.logspace(start,end,steps,out=None)

生成10的start次方和10的end次方的steps个数据点

print(torch.logspace(-10,10,10))#输出tensor([1.0000e-10, 1.6681e-08, 2.7826e-06, 4.6416e-04, 7.7426e-02, 1.2915e+01,
        #2.1544e+03, 3.5938e+05, 5.9948e+07, 1.0000e+10])

5、torch.rand(*size)

生成均值为0,方差为1的高斯分布数据

print(torch.randn((2,3)))

6、torch.randn(*size)

生成均值为0,方差为1的高斯分布数据

print(torch.randn((2,3)))

7、torch.arange(start,end,step=1,out=None)

返回一维张量,在[start,end)之间
torch.range(start,end,step=1,out=None)没什么区别,只不过数据包含end

print(torch.arange(1,89,9))#输出tensor([ 1, 10, 19, 28, 37, 46, 55, 64, 73, 82])

二、索引 切片 连接 换位

2.1 torch.cat(tensors,dim=0,out=None)

第⼀个参数tensors是你想要连接的若⼲个张量,按你所传⼊的顺序进⾏连接,注意每⼀个张量需要形状相同,或者更准确的说,进⾏⾏连接的张量要求列数相同,进⾏列连接的张量要求⾏数相同

第⼆个参数dim表⽰维度,dim=0则表⽰按⾏连接,dim=1表⽰按列连接

a=torch.tensor([[1,2,3,4],[1,2,3,4]])
b=torch.tensor([[1,2,3,4,5],[1,2,3,4,5]])
print(torch.cat((a,b),1))

#输出结果为:

tensor([[1, 2, 3, 4, 1, 2, 3, 4, 5],

[1, 2, 3, 4, 1, 2, 3, 4, 5]])

2.2 torch.chunk(tensor,chunks,dim=0)

torch.cat()函数是把各个tensor连接起来,这⾥的torch.chunk()的作⽤是把⼀个tensor均匀分割成若⼲个⼩tensor

源码定义:torch.chunk(intput,chunks,dim=0)

第⼀个参数input是你想要分割的tensor

第⼆个参数chunks是你想均匀分割的份数,如果该tensor在你要进⾏分割的维度上的size不能被chunks整除,则最后⼀份会略⼩(也可能为空)

第三个参数表⽰分割维度,dim=0按⾏分割,dim=1表⽰按列分割

该函数返回由⼩tensor组成的list

c=torch.tensor([[1,4,7,9,11],[2,5,8,9,13]])
print(torch.chunk(c,3,1))

#输出结果为:

(tensor([[1, 4],

[2, 5]]), tensor([[7, 9],

[8, 9]]), tensor([[11],

[13]]))

2.3 torch.gather(input,dim,index,out=None)

灵活的选取index指定的位置的值进行聚合
注意:
1.index必须是一个张量,不能是普通数组
2.index的形状和input的形状可以不相同
3.index的值作为位置的索引
4.选取值的规则如下:
out[i][j][k] = tensor[index[i][j][k]][j][k] # dim=0
out[i][j][k] = tensor[i][index[i][j][k]][k] # dim=1
out[i][j][k] = tensor[i][j][index[i][j][k]] # dim=3

torch.set_printoptions(precision=2)
a=torch.rand(2,3)
aa=torch.gather(a,1,index=torch.LongTensor([[0,1,2],[2,1,1]]))
print("a=",a)
print("aa=",aa)

每个位置的输出结果是:
[0,0] [0,1] [0,2]
[1,2] [1,1] [1,1]
在这里插入图片描述
注:输出的形状和index一致

说明:如果还存在歧义请参考链接:https://www.cnblogs.com/yanghailin/p/18007025

2.4 torch.index_select(input, dim, index)

torch.set_printoptions(precision=2)
# 选取第0行和第3行
a=torch.rand(4,6)
aa=torch.index_select(a,dim=0,index=torch.LongTensor([0,3]))
print('a=',a)
print('aa=',aa)
# 选取第1列和第5列
aaa=torch.index_select(a,dim=1,index=torch.LongTensor([1,5]))
print('aaa=',aaa)
# 选取a的第0行第3行、第1列和第5列,没有先后顺序
aaaa=torch.index_select(aa,dim=1,index=torch.LongTensor([1,5]))
print('aaaa=',aaaa)

2.5 torch.masked_select(input,mask)

a=torch.rand(2,3)
mask1=torch.BoolTensor([[1,0,1],[0,1,0]])
mask2=torch.ByteTensor([[True,False,True],[False,True,False]])
mask3=torch.BoolTensor([[True,False,True],[False,True,False]])
#[[True,False,True],[False,True,False]]
aa=torch.masked_select(a,mask3)
print('a=',a)
print('aa=',aa)

2.6 torch.nonzero(input)

返回非0元素的位置索引
如果输入是n维,那么输出的tensor形状是z*n的,z是输入中所有非0元素的总个数

a=torch.tensor([[[1,0,3],[0,0,9]],[[1,2,0],[0,9,0]]])
aa=torch.nonzero(a)
print('a=',a)
print('aa=',aa)

2.7 torch.split(tensor,split_size,dim)

split_size是切分成的单个块的大小,和chunk不同的是chunk指定的是分块的个数的数量,相同点是它们返回的都是元组,两个效果类似

a=torch.rand(2,3)
aa=torch.split(a,2,dim=1)
print('a=',a)
print('aa=',aa)

2.8 torch.squeeze(input,dim=None)

将形状中为1的维度去除,比如输入的形状是(A1BCD1E)那么输出的形状是(ABCDE)
就指定维度,也只对1的形状有效,如果指定的维度长度不为1,则无效,原样输出

a=torch.rand(2,3,1)
aa=torch.squeeze(a)
print('a=',a.size())
print('aa=',aa.size())
aaa=torch.squeeze(a,dim=1)
print('aaa=',aaa.size())

注意:
虽然squeeze前后squeeze后的维度不一致,但是数据量(数据元素的个数)是一致的,并且它们共享一片存储区域,当修改其中一个值时,另一个也会跟着修改。

2.9 torch.stack(sequence,dim=0)-堆叠函数

将序列中包含的张量按照指定维度连接,所有张量的形状应该相同,否则会报错。增加新维度,不是在原有基础上叠加
如两个(2,3)进行stack得到的不会是(4,3),而是(2,2,3)

a=torch.rand(2,3)
b=torch.rand(2,3)
ab=torch.stack((a,b),dim=0)
print('a=',a)
print('b=',b)
print('ab_size=',ab.size())
print('ab=',ab)

2.10 torch.transpose(input,dim0,dim1)-转置函数

1)交换维度

a=torch.rand(2,3,4)
print('a_size:',a.size())
aa=torch.transpose(a,2,1)
print('aa_size:',aa.size())

2) 共享内存

2.11 torch.unbind(tensor,dim)-解除维度

(2,3,4)->(1,3,4)+(1,3,4)的元组dim=0时
(2,3,4)->(2,1,4)+(2,14)+(2,1,4)的元组dim=1时

a=torch.rand(2,3,4)
aa=torch.unbind(a,1)
print(aa)
print(aa[1].size())

返回的是元组

2.12 torch.unsqueeze(tensor,dim)

1)squeeze的反操作,在dim指定的位置增加一个长度为1的维度(abcd)->(a1bc*d)若dim=1
2)共享内存

a=torch.rand(2,3,4)
aa=torch.unsqueeze(a,2)
print(aa.size())

相关推荐

  1. Pytorch函数用法归纳:创建tensor张量

    2024-07-15 07:36:01       27 阅读
  2. 自用-

    2024-07-15 07:36:01       23 阅读
  3. cmake函数

    2024-07-15 07:36:01       51 阅读
  4. mysql函数

    2024-07-15 07:36:01       60 阅读
  5. excel 函数

    2024-07-15 07:36:01       52 阅读
  6. SQL函数

    2024-07-15 07:36:01       37 阅读
  7. MySQL函数

    2024-07-15 07:36:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 07:36:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 07:36:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 07:36:01       58 阅读
  4. Python语言-面向对象

    2024-07-15 07:36:01       69 阅读

热门阅读

  1. CentOS Stream 卸载 Podman 并安装 Docker 的方法

    2024-07-15 07:36:01       22 阅读
  2. 关于 LayoutInflater.inflate 的取值结论

    2024-07-15 07:36:01       21 阅读
  3. Zynq7000系列FPGA中的DMA控制器的编程限制

    2024-07-15 07:36:01       19 阅读
  4. [Spring Boot]定时任务因系统时间修改之后无法执行

    2024-07-15 07:36:01       19 阅读
  5. Redis避坑疑难杂症

    2024-07-15 07:36:01       19 阅读
  6. Leetcode【零钱兑换】

    2024-07-15 07:36:01       27 阅读