跳转至

IDL 中的数组去重

原文链接:https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/array-uniqueness-in-idl

18957 文章评分:

4.0

IDL 中的数组去重

匿名作者 2014年10月31日,星期五

当人们需要从数据中提取信息时,通常必须检查每个唯一元素——但如果能剔除重复项,为何还要浪费时间检查每个元素呢?

IDL 内置的 uniq 函数正是为此而生。该函数会遍历数组,并删除所有相邻的重复项。

假设有一个数组:

IDL> array = [1,2,2,5,1,4,4,2]

当我们对该数组执行 uniq 操作时,它会返回非相邻重复项的索引。输出结果如下:

IDL> print, uniq(array)

0        2       3        4        6        7

要获得删除重复项后的原始数组,我们可以用这些索引提取数组的子集:

IDL> print, array[uniq(array)]

1       2      5       1       4      2

虽然重复的 2 和 4 已被移除,但数组中仍存在其他重复项。要获取每个唯一元素仅出现一次的版本,首先需要使用 sort 函数。该函数同样返回索引——此处是将数组按升序排列的索引:

IDL> print, sort(array)

4        0        7       2        1        6       5        3

uniq 类似,这些索引可用于重新排序原始数组以获得排序后的数组:

IDL> print, array[sort(array)]

1       1      2       2       2      4       4       5

现在是最后一步——由于排序后的数组已将相同元素相邻排列,现在我们可以使用 uniq 函数提取数组中的所有唯一元素:

IDL> s = array[sort(array)]

IDL> print, s[uniq(s)]

1       2      4       5

若偏好单行代码实现:

IDL> print, (array[sort(array)])[uniq(array[sort(array)])]

1       2      4       5

现在,IDL 无需遍历整个数组检查每个元素,而是能在一个尺寸减半的数组中完成检索。

IDL 到底在搞什么?垃圾回收机制 ENVI Tasks 让 ENVI 更智能