我一直在寻找一种方法来有效地检查numpy数组中的重复项,并偶然发现了一个包含使用此代码的答案的问题。
这条线在numpy中意味着什么?
s[s[1:] == s[:-1]]
想要在应用之前理解代码。查看Numpy文档,但无法找到这些信息。
答案 0 :(得分:21)
切片[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])
请注意,这仅标识相邻的重复值。
答案 1 :(得分:6)
检查出来:
>>> 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]
除了最后一个。
现在比较这两个向量,例如看看两个相邻的元素是否相同。最后,选择这些元素。
答案 2 :(得分:3)
s[1:] == s[:-1]
将没有第一个元素的s
与没有最后一个元素的s
进行比较,即0表示1st,1st表示第二个等,给出一个len(s) - 1
布尔数组元素。 s[boolarray]
只会选择s
中True
中boolarray
对应位置{{}}}的元素。因此,代码提取所有与下一个元素相等的元素。
答案 3 :(得分: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]
会过滤索引True
中array
的表达式。