在numpy中,s[s[1:] == s[:-1]]是什么意思?

20

我一直在寻找一种高效地检查numpy数组中重复项的方法,并偶然发现了一个包含以下代码答案的问题。

这行代码在numpy中是什么意思?

s[s[1:] == s[:-1]]

在应用代码之前希望能够理解它。查看了Numpy文档,但很难找到这些信息。

4个回答

27

切片 [1:][:-1] 意味着该数组中除了第一个元素和最后一个元素之外的所有元素:

>>> import numpy as np
>>> s = np.array((1, 2, 2, 3))  # four element array
>>> s[1:]
array([2, 2, 3])  # last three elements
>>> s[:-1]
array([1, 2, 2])  # first three elements
因此,比较生成了一个布尔比较数组,用于比较每个元素 s[x] 和它的“邻居”s[x+1],这个数组将比原数组短一个元素(因为最后一个元素没有邻居):
>>> s[1:] == s[:-1]
array([False,  True, False], dtype=bool)

使用该数组来索引原始数组,可以得到比较结果为True的元素,即与其相邻元素相同的元素:

>>> s[s[1:] == s[:-1]]
array([2])

请注意,这仅识别相邻的重复值。


哇,谢谢你详细的解释 :D。我会尽快接受的。所以我猜要找到所有的重复项,先排序然后这样做 :D。 - AturSams
@zehelvion 是的,如果数组未排序,则需要先进行排序,以便此方法找到所有重复项。 - jonrsharpe
数组排序不应该是一个要求吗? - gabhijit
1
@gabhijit 不一定,你可能只是找到相邻的重复项。 - jonrsharpe
1
尝试使用常规(非numpy)布尔列表(即掩码)来索引常规列表。当然,那行不通。所以我改用了这个:[x for (x,y) in zip(my_list, mask) if y]。虽然它当然不会查找相邻的相等元素,但我想在这里记录一下。 - Oliphaunt

8

看看这个:

>>> s=numpy.array([1,3,5,6,7,7,8,9])
>>> s[1:] == s[:-1]
array([False, False, False, False,  True, False, False], dtype=bool)
>>> s[s[1:] == s[:-1]]
array([7])

所以s[1:]表示除第一个元素外的所有数字,而s[:-1]则表示除最后一个数字外的所有数字。 现在比较这两个向量,例如查看相邻的两个元素是否相同。最后,选择这些元素。


3

这将会展示一个已排序数组中的重复项。

基本上,内部表达式 s[1:] == s[:-1] 比较了该数组与其移位版本。可以想象一下:

1, [2, 3, ... n-1, n  ]
-  [1, 2, ... n-2, n-1] n
=> [F, F, ...   F, F  ]

在一个排序数组中,除非有重复项,否则结果数组中不会出现True。然后,表达式s[array]过滤掉索引array中具有True的内容。

3

s[1:] == s[:-1] 比较去掉第一个元素后的 s 与去掉最后一个元素后的 s 是否相等,也就是 0 索引和 1 索引比较、1 索引和 2 索引比较等等,得到一个包含 len(s) - 1 个布尔值的数组。 s[boolarray] 将从 s 中仅选择那些在 boolarray 对应位置上有 True 的元素。因此,该代码提取了所有与下一个元素相等的元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接