np.delete 没有做任何独特或特殊的事情。它只是返回原始数组的副本,其中缺少一些项目。大多数代码只是解释输入以准备制作此副本。
你问的是obj参数
obj : 切片、整数或整数数组
简单来说,np.s_ 允许您使用熟悉的: 语法提供切片。 x:y 表示法不能用作函数参数。
让我们试试你的替代方案(你在结果和错误中提到了这些,但它们隐藏在文本中):
In [213]: x=np.arange(10)*2 # some distinctive values
In [214]: np.delete(x, np.s_[3:6])
Out[214]: array([ 0, 2, 4, 12, 14, 16, 18])
所以delete 和s_ 删除了一系列值,即6 8 10,第3 到第5 个值。
In [215]: np.delete(x, [3:6])
File "<ipython-input-215-0a5bf5cc05ba>", line 1
np.delete(x, [3:6])
^
SyntaxError: invalid syntax
为什么会出错?因为[3:4] 是一个索引表达式。 np.delete 是一个函数。即使s_[[3:4]] 也有问题。 np.delete(x, 3:6) 也很糟糕,因为 Python 仅在索引上下文中接受 : 语法,它会自动将其转换为 slice 对象。请注意,这是 syntax error,解释器在进行任何计算或函数调用之前捕获的内容。
In [216]: np.delete(x, slice(3,6))
Out[216]: array([ 0, 2, 4, 12, 14, 16, 18])
slice 代替 s_ 起作用;事实上这就是s_ 产生的结果
In [233]: np.delete(x, [3,4,5])
Out[233]: array([ 0, 2, 4, 12, 14, 16, 18])
列表也可以,但它的工作方式不同(见下文)。
In [217]: np.delete(x, x[3:6])
Out[217]: array([ 0, 2, 4, 6, 8, 10, 14, 18])
这可行,但产生的结果不同,因为x[3:6] 与range(3,6) 不同。 np.delete 也不能像 list 删除一样工作。它按索引删除,而不是按匹配值删除。
np.index_exp 失败的原因与np.delete(x, (slice(3,6),)) 相同。 1、[1]、(1,) 均有效并删除一项。甚至'1',字符串,也有效。 delete 解析这个参数,并且在这个级别,期望一些可以变成整数的东西。 obj.astype(intp)。 (slice(None),) 不是切片,它是一个 1 项元组。所以它在delete 代码中的不同位置处理。这是由delete 调用的东西产生的TypeError,与SyntaxError 非常不同。理论上delete 可以从元组中提取切片并按照s_ 的情况进行处理,但开发人员没有选择考虑这种变化。
对代码的快速研究表明,np.delete 使用 2 种不同的复制方法 - 通过切片和布尔掩码。如果obj 是一个切片,就像我们的示例一样,它确实是(对于一维数组):
out = np.empty(7)
out[0:3] = x[0:3]
out[3:7] = x[6:10]
但是使用[3,4,5](而不是切片)它可以:
keep = np.ones((10,), dtype=bool)
keep[[3,4,5]] = False
return x[keep]
结果相同,但构造方法不同。 x[np.array([1,1,1,0,0,0,1,1,1,1],bool)] 做同样的事情。
事实上,像这样的布尔索引或屏蔽比np.delete 更常见,而且通常同样强大。
来自lib/index_tricks.py 源文件:
index_exp = IndexExpression(maketuple=True)
s_ = IndexExpression(maketuple=False)
它们是同一事物的略微不同的版本。两者都只是便利功能。
In [196]: np.s_[1:4]
Out[196]: slice(1, 4, None)
In [197]: np.index_exp[1:4]
Out[197]: (slice(1, 4, None),)
In [198]: np.s_[1:4, 5:10]
Out[198]: (slice(1, 4, None), slice(5, 10, None))
In [199]: np.index_exp[1:4, 5:10]
Out[199]: (slice(1, 4, None), slice(5, 10, None))
maketuple 业务仅适用于单个项目、切片或索引。