Swift返回将对数组进行排序的索引(类似于numpy argsort)

时间:2015-03-21 13:15:34

标签: sorting swift numpy

我正在尝试返回与排序值对应的数组的索引。例如,

let arr = [7, 10, -3]
let idxs = argsort(arr) // [2, 0, 1]

我的尝试有效但不漂亮,只有CGFloat的功能。我正在寻找一些方法来改进功能,使其更通用,更容易阅读。代码看起来很难看,

func argsortCGFloat( a : [CGFloat] ) -> [Int] {

    /* 1. Values are wrapped in (index, values) tuples */
    let wrapped_array = Array(Zip2(indices(a),a))

    /* 2. A comparator compares the numerical value from 
       two tuples and the array is sorted */
    func comparator(a: (index : Int, value : CGFloat), b: (index : Int, value : CGFloat)) -> Bool {
        return a.value < b.value
    }
    var values = sorted(wrapped_array, comparator)

    /* 3. The sorted indexes are extracted from the sorted 
       array of tuples */
    var sorted_indexes: [Int] = []
    for pair in values {
        sorted_indexes.append(pair.0)
    }

    return sorted_indexes
}

1 个答案:

答案 0 :(得分:1)

您可以通过创建索引数组并使用外部上下文中的数组对它们进行排序来完成此操作,如下所示:

func argsort<T:Comparable>( a : [T] ) -> [Int] {
    var r = Array(indices(a))
    r.sort({ a[$0] > a[$1] })
    return r
}

let arr = [7, 10, -3]
let idxs = argsort(arr)
println (idxs)