从多维数组中提取特定元素
Posted
技术标签:
【中文标题】从多维数组中提取特定元素【英文标题】:Extract specific elements from a multidimensional array 【发布时间】:2021-06-27 14:55:17 【问题描述】:我想使用另一个数组的索引数组来提取指定的元素。
使得结果是一维数组或结果。
显然不太正确的伪代码:
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]
【问题讨论】:
元组数组不是更适合索引吗? 如果我得到了索引元组,我认为是的,这样会更好! 您可能在这里使用了错误的数据结构。[[Double]]
不是“二维数组”。它是一个数组数组。这些是不同的东西。例如,每一行可以有不同数量的元素。它的行为不像矩阵,对其进行变异往往比预期的要昂贵。如果您想要一个“固定大小和维度的多维数组”,在大多数情况下,我建议将其构建为自定义结构并为其提供所需的接口(通常将值存储为简单的一维数组)。
(不幸的是,您不能做的一件事是定义一个通用的Matrix<N>
,其中N
是一个整数,并且可以在编译时检查下标的正确长度。Swift 不支持一种参数化。)
【参考方案1】:
使用元组作为索引会使您的代码更安全,因为元组可以声明为具有固定数量的元素。
以下是可能的实现方式:
func extract<T>(indices: [(Int, Int)], from array: [[T]]) -> [T]
indices.map array[$0][$1]
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[$0][$1][$2]
【讨论】:
糟糕,有人不喜欢这个问题的答案,都被否决了 是的,忽略花生画廊。 :) 谢谢你们俩【参考方案2】:这是一个可以从数组中提取动态数量的元素的函数。为了简化参数,索引作为单个值给出,因此它们应该以正确的顺序给出。我还使用precondition
来检查给定的索引是不是很多或很大
func extract<Value>(from array: [[Value]], _ indices: Int...) -> [Value]
precondition(indices.count <= array.count)
return indices.enumerated().map
let row = array[$0.offset]
precondition(row.count > $0.element)
return row[$0.element]
此处测试的替代方法是使用可选索引Int?...
不从所有列中提取和/或在使用可选索引时返回[Value?]
或避免前置条件逻辑。
【讨论】:
【参考方案3】:你可以试试
let p:[[Double]] = [[3,2],[4,1]]
let t:[[Int]] = [[0,0],[1,0]]
let res = t.map p[$0.first!][$0.last!]
print(res)
【讨论】:
太好了,适用于二维数组。这是通用的吗?有没有办法解构 lambda 参数? 可以是let res = t.map x in p[x.first!][x.last!]
也许我不够通用。我将您的答案标记为..即使现在我想要更像t.map coords in elementAtIndex(index: coords, from: p)
@robertotomás:这种elementAtIndex(index: coords, from: p)
方法的问题在于Swift中没有固定大小的数组,所以编译器没有办法检查@987654325的“长度” @ 匹配 p
的“维度”。通过Any
可能有一个解决方案,但这不会很好,你会失去类型安全。以上是关于从多维数组中提取特定元素的主要内容,如果未能解决你的问题,请参考以下文章
python 3 三维数组或者多维数组 怎么计算元素的百分比,详细里面会具体一点