python 中的內置函數slice()

slice()函數是一個切片函數,可以作用於list,tuple,numpy等結構,其作用類似於列表中常見的切片操作,但是如果按照某個長度將list等可以用於切片的序列做等分,一般可以用一個循環可以實現。

l =[1,2,3,4,5,6,7,8,9,10]
i = 0
while(i<10):
    print(l[i:i+2])
    i += 2

output:
[1, 2]
[3, 4]
[5, 6]
[7, 8]
[9, 10]

這個過程,可以用slice()函數代替。

fold_size = 2  
for j in range(len(l)//fold_size):
    idx = slice(j*fold_size,(j+1)*fold_size)
    print(l[idx])

slice()函數一共有三個參數:start,end,step。step默認爲1。slice()根據start,end,step返回一個slice(0, 2, None)結構,然後應用於列表結構。

這樣看,slice()函數的好處並沒有特別多的體現,但是它能容易地用於tensor結構,也就是2維甚至更高維度。

import torch
x = torch.rand(10,8)

fold_size = 2
for j in range(0,x.size()[1]//fold_size):
    idx = slice(j * fold_size, (j + 1) * fold_size)  
    print(x[:,idx])  ##切分8維度,切分10維度-> x[idx,:]
    print(x[:,idx].size())

'''
將8這個維度,每份爲2進行切分,返回每份大小。
output:
tensor([[0.6415, 0.9648],
        [0.2723, 0.1438],
        [0.5300, 0.8959],
        [0.1583, 0.9972],
        [0.4612, 0.9555],
        [0.9713, 0.9526],
        [0.5785, 0.1008],
        [0.1837, 0.9140],
        [0.6577, 0.1127],
        [0.0530, 0.7081]])
torch.Size([10, 2])
'''

在對於切分tensor結構中,slice()內置函數和tensor中的split()作用類似。

for step,x in enumerate(torch.split(x,2,dim=1)):
    print(x)

'''
x按照第二維度,每塊2切分
x同上'''

因爲tensor中有split(),但是在numpy等結構中,可以用slice()做切分,下面是numpy結構的一個切分。

import numpy as np
x = [[1,2,3,1],[4,5,6,1],[7,8,9,1],[10,11,12,1]]
x = np.array(x)

fold_size = 2
for j in range(0,x.shape[1]//fold_size):
    idx = slice(j * fold_size, (j + 1) * fold_size)  
    print(x[:,idx])
    print(x[:,idx].shape)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章