python-2.7 - np.delete 和 np.s_。 np_s 有什么特别之处?

标签 python-2.7 numpy indexing slice delete-row

我不太明白为什么常规索引不能用于 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 相同,只是它不返回元组,但两者都可以在 Python 代码中的任何地方使用。

然后,当我查看 np.delete 函数时,它表明您可以使用类似 [1,2,3] 的方法来删除整个数组中的那些特定索引。那么是什么阻止我使用类似的方法从数组中删除某些行或列呢?

我只是假设这种类型的索引在 np.delete 中被读取为其他内容,因此您需要使用 np.s_ 来指定,但我无法弄清楚它到底是什么阅读它是因为当我尝试第二段代码时,它只是返回“无效语法”。这很奇怪,因为这段代码可以工作......

inlet_names = np.delete(inlet_names, [1,2,3,4,5,6,7,8,9], axis = 0)   

所以我猜答案可能是 np.delete 只接受您想要删除的索引列表。 np._s 返回您为切片指定的索引列表。

只是可以对我刚才所说的有关可能错误的功能的任何内容进行一些澄清和更正,因为其中很多只是我的看法,这些文档并没有完全解释我试图理解的所有内容。我想我只是想太多了,但如果有人可以解释的话,我想真正理解它。

最佳答案

np.delete 没有做任何独特或特殊的事情。它只是返回原始数组的副本,其中缺少一些项目。大多数代码只是解释输入以准备制作此副本。

您要问的是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])

因此,deletes_ 会删除一系列值,即 6 8 10,即第三个到第五个值。

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 只接受索引上下文中的 : 语法,并自动将其转换为 切片 对象。请注意,这是一个语法错误,解释器在执行任何计算或函数调用之前会捕获该错误。

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 使用两种不同的复制方法 - 通过切片和 bool 掩码。如果 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)] 做同样的事情。

事实上,像这样的 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 业务仅在存在单个项目、切片或索引时适用。

关于python-2.7 - np.delete 和 np.s_。 np_s 有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32682754/

相关文章:

Visual Studio Code 中的 Python 重构失败

python - 如何在 scikit-learn 中进行预处理后保留数据帧的列标题

sql-server - 为什么 SQL Server Tuning Advisor 建议将 PRIMARY KEY 添加到索引的包含列?

Python 处理终端和文件中的颜色

python - 为什么这会返回 False

python - 从稀疏矩阵中获取所有唯一值[python/scipy]

python - Numpy "fill"方法是如何实现的?

oracle - 在 Oracle 中为大表的新列创建索引

python - Cython:(为什么/何时)最好使用 Py_ssize_t 进行索引?

python-2.7 - httpd 似乎没有在运行和代理 cobbler,或者 SELinux 在路上