从多维数组中提取特定元素

Extract specific elements from a multidimensional array

我想使用另一个数组的索引数组来提取指定的元素。

使得结果是一维数组或结果。

明显不太正确的伪代码:

let p:[[Double]] = [[3,2],[4,1]]
let t:[[Int]] = [[0,0],[1,0]]
t.map{ (y,x) in p[y][x] } // expecting: [3,4]

你可以试试

let p:[[Double]] = [[3,2],[4,1]]
let t:[[Int]] = [[0,0],[1,0]]
let res = t.map { p[[=10=].first!][[=10=].last!] }  
print(res)

使用元组作为索引会使您的代码更安全,因为可以声明元组具有固定数量的元素。

以下是可能的实施方式:

func extract<T>(indices: [(Int, Int)], from array: [[T]]) -> [T] {
    indices.map { array[[=10=]][] }
}

let p: [[Double]] = [[3,2], [4,1]]
let t = [(0,0), (1,0)]
print(extract(indices: t, from: p)) // [3.0, 4.0]

可以添加重载以支持 3-D 数组或 4-D 数组。例如,对于 3-D 数组:

func extract<T>(indices: [(Int, Int, Int)], from array: [[[T]]]) -> [T] {
    indices.map { array[[=11=]][][] }
}

这是一个可以从数组中提取动态数量元素的函数。为了简化参数,索引作为单个值给出,因此它们应该以正确的顺序给出。我还使用 precondition 检查给定的索引是否太多或太大

func extract<Value>(from array: [[Value]], _ indices: Int...) -> [Value] {
    precondition(indices.count <= array.count)

    return indices.enumerated().map {
        let row = array[[=10=].offset]
        precondition(row.count > [=10=].element)

        return row[[=10=].element]
    }
}

此处测试的替代方法是使用可选索引 Int?... 在使用可选索引时不从所有列 and/or return 中提取 [Value?] 或避免前提逻辑。