一、公共部分
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())