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 语法详解与使用示例

11 回复

bool 值可以作为 0,1 使用


slice语法是Python里处理序列(字符串、列表、元组)子集的利器,核心就三个参数:startstopstep,写成[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]

记住,startstop可以超出序列长度,Python会自动处理成边界值。step为负时是反向切片。[:]是生成浅拷贝的常用写法。slice()函数让你能把切片逻辑存成变量复用。

一句话:用好[start:stop:step]这个公式,序列操作基本就通了。

y != 0 这个表达式的值为 True or False,
显然在 slice 中,True 是 1, False 是 0

顿悟,谢谢楼上

你有运行过 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))

感谢纠正,涨知识了。

回到顶部