我试图通过抽取或提取每个第X个项来对长数组进行下采样。
这是我为数组扩展所获得的内容:
func downsampled(to threshold: Int) -> [T] {
// Validate that threshold falls in valid range
guard !isEmpty, 1...count ~= threshold else { return Array(self) }
let skip = (count / threshold) + 1
var index = 0
var items = [T]()
while index < count {
items.append(self[index])
index += skip
}
return items
}
我期待原始数组中的50-100k项目,并且可能会下采样到屏幕的原生边界宽度(500-1k点)。
有更简洁或有效的方法吗?
答案 0 :(得分:5)
它可能没有更高的效率,但我认为使用步幅更简洁(从:,到:,by :),如下所示:
extension Array {
func every(nth: Int) -> Array {
var result: Array = []
stride(from: 0, to: count, by: nth).forEach { result.append(self[$0]) }
return result
}
}
游乐场测试
let array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15].every(nth: 2)
array // [1, 3, 5, 7, 9, 11, 13, 15]