我一直在寻找一种高效地检查numpy数组中重复项的方法,并偶然发现了一个包含以下代码答案的问题。
这行代码在numpy中是什么意思?
s[s[1:] == s[:-1]]
在应用代码之前希望能够理解它。查看了Numpy文档,但很难找到这些信息。
切片 [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])
请注意,这仅识别相邻的重复值。
看看这个:
>>> 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]
则表示除最后一个数字外的所有数字。
现在比较这两个向量,例如查看相邻的两个元素是否相同。最后,选择这些元素。
这将会展示一个已排序数组中的重复项。
基本上,内部表达式 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
的内容。s[1:] == s[:-1]
比较去掉第一个元素后的 s
与去掉最后一个元素后的 s
是否相等,也就是 0 索引和 1 索引比较、1 索引和 2 索引比较等等,得到一个包含 len(s) - 1
个布尔值的数组。 s[boolarray]
将从 s
中仅选择那些在 boolarray
对应位置上有 True
的元素。因此,该代码提取了所有与下一个元素相等的元素。
[x for (x,y) in zip(my_list, mask) if y]
。虽然它当然不会查找相邻的相等元素,但我想在这里记录一下。 - Oliphaunt