【发布时间】:2015-08-30 02:48:56
【问题描述】:
我一直在寻找一种方法来有效地检查 numpy 数组中的重复项,并偶然发现了一个包含使用此代码的答案的问题。
这一行在 numpy 中是什么意思?
s[s[1:] == s[:-1]]
希望在应用之前了解代码。查看了 Numpy 文档,但找不到此信息。
【问题讨论】:
我一直在寻找一种方法来有效地检查 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] 与其 "neighbour" s[x+1] 之间生成一个布尔比较数组,这将比原始数组短一个(因为最后一个元素没有邻居):
>>> s[1:] == s[:-1]
array([False, True, False], dtype=bool)
并使用该数组对原始数组进行索引,您可以获得比较为True 的元素,即与其邻居相同的元素:
>>> s[s[1:] == s[:-1]]
array([2])
请注意,这只标识相邻重复值。
【讨论】:
[x for (x,y) in zip(my_list, mask) if y]。以为我会在这里记录它,尽管它当然不会寻找相等的相邻元素。
看看这个:
>>> 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] 将没有第一个元素的 s 与没有最后一个元素的 s 进行比较,即第 0 个与第 1 个、第 1 个与第 2 个等,为您提供 len(s) - 1 布尔元素数组。 s[boolarray] 将只从s 中选择那些在boolarray 对应位置具有True 的元素。因此,代码会提取与下一个元素相等的所有元素。
【讨论】:
它将在已排序的数组中显示重复项。
基本上,内部表达式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 的那些。
【讨论】: