Python 中的 slice 语法详解与使用示例
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X[y != 0, :2]
y = y[y != 0]
第四行 X = X[y != 0, :2]是什么意思?
len(X)#150
X[y != 0]#150
X[y != 0, :2]#150
请教各位
官方文档里只有 s[i:j]和 s[i:j:k]两种操作
Python 中的 slice 语法详解与使用示例
bool 值可以作为 0,1 使用
slice语法是Python里处理序列(字符串、列表、元组)子集的利器,核心就三个参数:start、stop、step,写成[start:stop:step]。start是起始索引(包含),stop是结束索引(不包含),step是步长。任何一个都可以省略。
直接看代码最清楚:
# 基础切片
my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(my_list[2:7]) # 输出: [2, 3, 4, 5, 6] 取索引2到6
print(my_list[:5]) # 输出: [0, 1, 2, 3, 4] 从头开始到索引4
print(my_list[5:]) # 输出: [5, 6, 7, 8, 9] 从索引5到末尾
print(my_list[:]) # 输出: 完整列表的浅拷贝
# 使用负索引(从末尾倒数)
print(my_list[-3:]) # 输出: [7, 8, 9] 最后三个元素
print(my_list[:-2]) # 输出: [0, 1, 2, 3, 4, 5, 6, 7] 排除最后两个
# 使用步长step
print(my_list[::2]) # 输出: [0, 2, 4, 6, 8] 每隔一个取一个
print(my_list[1::2]) # 输出: [1, 3, 5, 7, 9] 从索引1开始每隔一个取
print(my_list[::-1]) # 输出: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 经典反转序列
# 更复杂的例子
print(my_list[2:8:2]) # 输出: [2, 4, 6] 索引2到7,步长为2
print(my_list[8:1:-2]) # 输出: [8, 6, 4, 2] 从索引8反向到索引2,步长-2
# 字符串和元组同样适用
my_str = "Hello, World!"
print(my_str[7:12]) # 输出: "World"
print(my_str[::-1]) # 输出: "!dlroW ,olleH"
my_tuple = (10, 20, 30, 40, 50)
print(my_tuple[1:4]) # 输出: (20, 30, 40)
# 切片对象(slice object)用于动态生成切片
data = list(range(20))
my_slice = slice(5, 15, 2) # 相当于 [5:15:2]
print(data[my_slice]) # 输出: [5, 7, 9, 11, 13]
记住,start和stop可以超出序列长度,Python会自动处理成边界值。step为负时是反向切片。[:]是生成浅拷贝的常用写法。slice()函数让你能把切片逻辑存成变量复用。
一句话:用好[start:stop:step]这个公式,序列操作基本就通了。
顿悟,谢谢楼上
你有运行过 X = X[y != 0, :2] 吗???
numpy 数组的行列可以单独切片
原来是第三方库的用法,我试过了 python2.7 3.4 没有这种语法。
你楼上的解释是错误的
y == [0,0,0,1,1,1,2,2,2]
y !=0 == [False, False, False, True, True,True, True,True,True,]
y[y != 0] == [1,1,1,2,2,2]
这当然是 python 2.7 3.4 的语法, 重载了 getitem 而已
class C(object):
…: def getitem(self, val):
…: print val
>>> c= C()
>>> c[1,2:3]
(1, slice(2, 3, None))
感谢纠正,涨知识了。


