Python分片索引

今天在看程序的时候,看到如下代码


data,classes,features = tree.read_data('breast_cancer.data')

train = data[::2][:]
test = data[1::2][:]
trainc = classes[::2]
testc = classes[1::2]

起初没怎么看明白,两个冒号叠在一块是干嘛?查了书之后才知道是分片索引。

冒号中最后的数字是步长,Python中默认是1,如果是2的话就是隔一个,3就是隔两个取一个。按照上述代码可以取数据的一半做测试集,一半做训练集。这样虽然不太符合一半做实验的时候7/3的取法,但是这样取出来的数据集分布是非常均匀的,训练集和测试集的分布同原始分布是差不多的。其实,还可以有个笨办法,把上面的步长改成3。


train = data[::3][:]
train1 = data[1::3][:]
test = data[2::3][:]

然后把train和train1合起来就好了。

第一个冒号前的数字是原来数组中索引的开始位置,第二个冒号前面的数字就是结束的位置,如果留空的话,就是按照默认取到最后。开始的元素包含在结果中,结束的元素不包含在结果中的。

步长不可以是0,但是可以是负数,也就是从右往左取。同样,开始的元素包括进去,结尾的元素不包括。看下面的例子就清楚了。


>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> numbers[::-2]
[10,8,6,4,2]

>>> numbers[5::-2]
[6,4,2]

>>> numbers[:5:-2]
[10,8]

今天学了一招,记录一下

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s