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 无需遍历整个数组检查每个元素,而是能在一个尺寸减半的数组中完成检索。