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

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 三维数组或者多维数组 怎么计算元素的百分比,详细里面会具体一点

如何从Vue中的多维数组中提取数据?

array_uintersect 将多维数组的每一行中的特定元素与字符串的平面数组进行比较

PHP提取多维数组指定一列的方法大全

PHP提取多维数组指定一列的方法大全

Python——ndarray多维数组基本操作(1)