从多维数组中提取特定元素
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?]
或避免前提逻辑。
我想使用另一个数组的索引数组来提取指定的元素。
使得结果是一维数组或结果。
明显不太正确的伪代码:
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?]
或避免前提逻辑。