【问题标题】:How to get a vertical Slice in a Swift 3 multi-dimensional array?如何在 Swift 3 多维数组中获得垂直切片?
【发布时间】:2017-05-19 05:00:22
【问题描述】:

我在 Swift 3 中有一个简单的二维数组,如下所示:

let myData = [[1, 2],[3, 4]]

我希望能够得到一个表示垂直列的简单切片,因此例如切片第一列会给我一个包含内容[1, 3] 的 ArraySlice。

我希望能够使用一些简单的语法在数组中生成一个 Slice,如下所示:

let sliceCol = myData[0...1][0]

let sliceRow = myData[0][0...1]

但两行代码都计算为仅是其中一行的切片(两种情况下的结果都是[1, 2])。

四处搜索会产生很多使用 Swift 扁平数组的结果,但在 Swift 中使用多维数组的示例似乎并不多。我可以简单地遍历数组并仅使用给定的列条目构建一个新数组,但我认为必须有一种有效的方法来从 Swift 3 中的多维数组中获取切片。

【问题讨论】:

    标签: arrays swift multidimensional-array slice


    【解决方案1】:

    这不是一个真正的二维数组。这是一个数组数组。有时人们试图将其视为 2D 数组,但实际上完全不同。例如,每一行不必具有相同数量的元素。由于写时复制行为,在 Swift 中改变这些数据结构往往非常昂贵。如您所见,即使访问它也可能非常低效。 stdlib 不包含真正的多维数组。

    如果您正在做需要真正的二维数组的事情,那么您将需要一个数据结构。对于小型矩阵,我建议查看 GLKit,其中包括浮点数的 3x3 和 4x4 矩阵。您还可以查看simd,其中包含许多矩阵类型。

    如果您的需求比这更普遍,那么您真的很想构建一个自定义的Matrix 类型。有很多examples on GitHub。如果您对此很认真,您可能想要寻找维护自己的写时复制后备存储并且内部不使用[[T]] 的东西。

    【讨论】:

    • 这是一个很好的点,它是一个数组,而不是经典意义上的真正的多维数组,我想我只是希望 Swift 有一些针对这种情况的语法快捷方式 - 现在一个自定义的 Matrix 类对于我需要的东西来说可能是多余的,但如果访问失控,我可能会考虑合并类似的东西。谢谢!
    • 所以这对任何人来说都是一个半相关的问题:为什么 Swift 中没有像 Numpy 这样的库,或者像 DataFrames 这样的 pandas?它会在矩阵代数计算时间上有很大的不同吗?
    猜你喜欢
    • 2015-04-10
    • 2023-03-29
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多