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)