np.delete 和 np.s_。 np_s 有什么特别之处?
np.delete and np.s_. What's so special about np_s?
我不太明白为什么常规索引不能用于np.delete。是什么让 np.s_ 如此特别?
例如这段代码,用于删除这个数组的一些行..
inlet_names = np.delete(inlet_names, np.s_[1:9], axis = 0)
为什么我不能简单地使用常规索引并做..
inlet_names = np.delete(inlet_names, [1:9], axis = 0)
或
inlet_names = np.delete(inlet_names, inlet_names[1:9], axis = 0)
据我所知,np.s_ 与 np.index_exp 相同,只是它不是 return 元组,但两者都可以在 Python 中的任何地方使用代码。
然后当我查看 np.delete 函数时,它表明您可以使用 [1,2,3]
之类的东西来删除整个数组中的那些特定索引。那么是什么阻止我使用类似的东西从数组中删除某些行或列?
我只是假设这种类型的索引在 np.delete 中被读取为其他内容,因此您需要使用 np.s_ 来指定,但我无法深入它究竟会把它读成什么,因为当我尝试第二段代码时,它只是 returns "invalid syntax"。这很奇怪,因为这段代码有效...
inlet_names = np.delete(inlet_names, [1,2,3,4,5,6,7,8,9], axis = 0)
所以我想答案可能是 np.delete 只接受您要删除的索引列表。 np._s return 是您为切片指定的索引列表。
只是可以对我刚才所说的可能错误的功能进行一些澄清和一些更正,因为其中很多只是我的看法,文档并没有完全解释我试图理解的一切.我想我只是想得太多了,但如果有人能解释的话,我想真正理解它。
np.delete
没有做任何独特或特别的事情。它只是 returns 原始数组的副本,缺少一些项目。大多数代码只是解释输入以准备制作此副本。
你问的是obj
参数
obj : slice, int or array of ints
简单来说,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])
A 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
代码中的不同位置处理。这是 TypeError
由 delete
调用的东西产生的,与 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
业务仅在有单个项目、切片或索引时适用。
我不太明白为什么常规索引不能用于np.delete。是什么让 np.s_ 如此特别?
例如这段代码,用于删除这个数组的一些行..
inlet_names = np.delete(inlet_names, np.s_[1:9], axis = 0)
为什么我不能简单地使用常规索引并做..
inlet_names = np.delete(inlet_names, [1:9], axis = 0)
或
inlet_names = np.delete(inlet_names, inlet_names[1:9], axis = 0)
据我所知,np.s_ 与 np.index_exp 相同,只是它不是 return 元组,但两者都可以在 Python 中的任何地方使用代码。
然后当我查看 np.delete 函数时,它表明您可以使用 [1,2,3]
之类的东西来删除整个数组中的那些特定索引。那么是什么阻止我使用类似的东西从数组中删除某些行或列?
我只是假设这种类型的索引在 np.delete 中被读取为其他内容,因此您需要使用 np.s_ 来指定,但我无法深入它究竟会把它读成什么,因为当我尝试第二段代码时,它只是 returns "invalid syntax"。这很奇怪,因为这段代码有效...
inlet_names = np.delete(inlet_names, [1,2,3,4,5,6,7,8,9], axis = 0)
所以我想答案可能是 np.delete 只接受您要删除的索引列表。 np._s return 是您为切片指定的索引列表。
只是可以对我刚才所说的可能错误的功能进行一些澄清和一些更正,因为其中很多只是我的看法,文档并没有完全解释我试图理解的一切.我想我只是想得太多了,但如果有人能解释的话,我想真正理解它。
np.delete
没有做任何独特或特别的事情。它只是 returns 原始数组的副本,缺少一些项目。大多数代码只是解释输入以准备制作此副本。
你问的是obj
参数
obj : slice, int or array of ints
简单来说,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])
A 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
代码中的不同位置处理。这是 TypeError
由 delete
调用的东西产生的,与 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
业务仅在有单个项目、切片或索引时适用。