PyTorch中Tensor的拼接與拆分的實(shí)現(xiàn)
拼接張量:torch.cat() 、torch.stack()
- torch.cat(inputs, dimension=0) → Tensor
在給定維度上對(duì)輸入的張量序列 seq 進(jìn)行連接操作
舉個(gè)例子:
>>> import torch
>>> x = torch.randn(2, 3)
>>> x
tensor([[-0.1997, -0.6900, 0.7039],
[ 0.0268, -1.0140, -2.9764]])
>>> torch.cat((x, x, x), 0) # 在 0 維(縱向)進(jìn)行拼接
tensor([[-0.1997, -0.6900, 0.7039],
[ 0.0268, -1.0140, -2.9764],
[-0.1997, -0.6900, 0.7039],
[ 0.0268, -1.0140, -2.9764],
[-0.1997, -0.6900, 0.7039],
[ 0.0268, -1.0140, -2.9764]])
>>> torch.cat((x, x, x), 1) # 在 1 維(橫向)進(jìn)行拼接
tensor([[-0.1997, -0.6900, 0.7039, -0.1997, -0.6900, 0.7039, -0.1997, -0.6900,
0.7039],
[ 0.0268, -1.0140, -2.9764, 0.0268, -1.0140, -2.9764, 0.0268, -1.0140,
-2.9764]])
>>> y1 = torch.randn(5, 3, 6)
>>> y2 = torch.randn(5, 3, 6)
>>> torch.cat([y1, y2], 2).size()
torch.Size([5, 3, 12])
>>> torch.cat([y1, y2], 1).size()
torch.Size([5, 6, 6])
對(duì)于需要拼接的張量,維度數(shù)量必須相同,進(jìn)行拼接的維度的尺寸可以不同,但是其它維度的尺寸必須相同。
- torch.stack(sequence, dim=0)
沿著一個(gè)新維度對(duì)輸入張量序列進(jìn)行連接。 序列中所有的張量都應(yīng)該為相同形狀
舉個(gè)例子:
>>> x1 = torch.randn(2, 3)
>>> x2 = torch.randn(2, 3)
>>> torch.stack((x1, x2), 0).size() # 在 0 維插入一個(gè)維度,進(jìn)行區(qū)分拼接
torch.Size([2, 2, 3])
>>> torch.stack((x1, x2), 1).size() # 在 1 維插入一個(gè)維度,進(jìn)行組合拼接
torch.Size([2, 2, 3])
>>> torch.stack((x1, x2), 2).size()
torch.Size([2, 3, 2])
>>> torch.stack((x1, x2), 0)
tensor([[[-0.3499, -0.6124, 1.4332],
[ 0.1516, -1.5439, -0.1758]],
[[-0.4678, -1.1430, -0.5279],
[-0.4917, -0.6504, 2.2512]]])
>>> torch.stack((x1, x2), 1)
tensor([[[-0.3499, -0.6124, 1.4332],
[-0.4678, -1.1430, -0.5279]],
[[ 0.1516, -1.5439, -0.1758],
[-0.4917, -0.6504, 2.2512]]])
>>> torch.stack((x1, x2), 2)
tensor([[[-0.3499, -0.4678],
[-0.6124, -1.1430],
[ 1.4332, -0.5279]],
[[ 0.1516, -0.4917],
[-1.5439, -0.6504],
[-0.1758, 2.2512]]])
把相同形狀的張量合并,并根據(jù)提供的維度序列在相應(yīng)位置插入維度,方法會(huì)根據(jù)位置來(lái)排列數(shù)據(jù)。代碼中,根據(jù)第 0 維和第 1 維來(lái)進(jìn)行合并時(shí),雖然合并后的張量維度和尺寸相等,但是數(shù)據(jù)的位置并不是相同的。
拆分張量:torch.split()、torch.chunk()
- torch.split(tensor, split_size, dim=0)
將輸入張量分割成相等形狀的 chunks(如果可分)。 如果沿指定維的張量形狀大小不能被 split_size 整分, 則最后一個(gè)分塊會(huì)小于其它分塊。
舉個(gè)例子:
>>> x = torch.randn(3, 10, 6) >>> a, b, c = x.split(1, 0) # 在 0 維進(jìn)行間隔維 1 的拆分 >>> a.size(), b.size(), c.size() (torch.Size([1, 10, 6]), torch.Size([1, 10, 6]), torch.Size([1, 10, 6])) >>> d, e = x.split(2, 0) # 在 0 維進(jìn)行間隔維 2 的拆分 >>> d.size(), e.size() (torch.Size([2, 10, 6]), torch.Size([1, 10, 6]))
把張量在 0 維度上以間隔 1 來(lái)拆分時(shí),其中 x 在 0 維度上的尺寸為 3,就可以分成 3 份。
把張量在 0 維度上以間隔 2 來(lái)拆分時(shí),只能分成 2 份,且只能把前面部分先以間隔 2 來(lái)拆分,后面不足 2 的部分就直接作為一個(gè)分塊。
- torch.chunk(tensor, chunks, dim=0)
在給定維度(軸)上將輸入張量進(jìn)行分塊兒
直接用上面的數(shù)據(jù)來(lái)舉個(gè)例子:
>>> l, m, n = x.chunk(3, 0) # 在 0 維上拆分成 3 份 >>> l.size(), m.size(), n.size() (torch.Size([1, 10, 6]), torch.Size([1, 10, 6]), torch.Size([1, 10, 6])) >>> u, v = x.chunk(2, 0) # 在 0 維上拆分成 2 份 >>> u.size(), v.size() (torch.Size([2, 10, 6]), torch.Size([1, 10, 6]))
把張量在 0 維度上拆分成 3 部分時(shí),因?yàn)槌叽缯脼?3,所以每個(gè)分塊的間隔相等,都為 1。
把張量在 0 維度上拆分成 2 部分時(shí),無(wú)法平均分配,以上面的結(jié)果來(lái)看,可以看成是,用 0 維度的尺寸除以需要拆分的份數(shù),把余數(shù)作為最后一個(gè)分塊的間隔大小,再把前面的分塊以相同的間隔拆分。
在某一維度上拆分的份數(shù)不能比這一維度的尺寸大
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Python實(shí)現(xiàn)評(píng)論區(qū)抽獎(jiǎng)功能詳解
這篇文章主要為大家介紹了基于Python如何實(shí)現(xiàn)評(píng)論區(qū)抽獎(jiǎng)的功能,文章的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的朋友可以學(xué)習(xí)一下2021-12-12
Python實(shí)現(xiàn)孤立隨機(jī)森林算法的示例代碼
孤立森林(isolation?Forest)是一種高效的異常檢測(cè)算法,它和隨機(jī)森林類似,但每次選擇劃分屬性和劃分點(diǎn)(值)時(shí)都是隨機(jī)的,而不是根據(jù)信息增益或基尼指數(shù)來(lái)選擇。本文將用Python實(shí)現(xiàn)這一算法,需要的可以參考一下2022-03-03
Python構(gòu)建XML樹(shù)結(jié)構(gòu)的方法示例
這篇文章主要介紹了Python構(gòu)建XML樹(shù)結(jié)構(gòu)的方法,結(jié)合實(shí)例形式分析了Python創(chuàng)建與打印xml數(shù)結(jié)構(gòu)的實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
Python十類常見(jiàn)異常類型總結(jié)(附捕獲及異常處理方式)
在編寫(xiě)程序時(shí)難免會(huì)遇到錯(cuò)誤,有的是編寫(xiě)人員疏忽造成的語(yǔ)法錯(cuò)誤,有的是程序內(nèi)部隱含邏輯問(wèn)題造成的數(shù)據(jù)錯(cuò)誤等等,這篇文章主要給大家介紹了關(guān)于Python十類常見(jiàn)異常類型總結(jié)的相關(guān)資料,文中還附捕獲及異常處理方式,需要的朋友可以參考下2023-06-06
python 定時(shí)修改數(shù)據(jù)庫(kù)的示例代碼
這篇文章主要介紹了python 定時(shí)修改數(shù)據(jù)庫(kù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例
今天小編就為大家分享一篇python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11

