F#如何将array2D附加/连接并将1D数组组合成array2D

6
在 F# 中,array.append 可以将两个数组连接起来;是否有一种方法可以将 2 个 array2D 对象附加到一个对象中,或者将多个 1-D 数组按列连接成一个 array2D 对象?
3个回答

6

array2D函数可以将任何seq<#seq<'T>>转换成'T [,],因此它适用于将一堆1D数组转换为2D数组。

let arr1 = [| 1; 2; 3 |]
let arr2 = [| 4; 5; 6 |]

let combined = array2D [| arr1; arr2 |]

3
据我所见,没有 F# 库函数可以将多个一维数组转换为一个二维数组,但是您可以使用 Array2D.init 函数编写自己的函数来实现此功能。
let joinInto2D (arrays:_[][]) = 
  Array2D.init arrays.Length (arrays.[0].Length) (fun i j ->
    arrays.[i].[j])

它需要一个数组的数组作为输入,所以当你调用它时,你需要给它一个包含所有想要合并的数组的数组(例如[| arr1; arr2 |]来合并两个数组)。该函数将多个一维数组连接成一个二维数组,其中每个输入数组都对应一个行。它假设所有给定的数组长度相同(最好使用Array.forall检查一下)。init函数创建指定维度的数组,然后调用我们的 lambda 函数计算每个元素的值,在 lambda 函数中,我们使用行作为数组的索引,列作为单个数组的索引。

以下是如何使用该函数的示例:

> let arr1 = [| 1; 2; 3 |]
  let arr2 = [| 4; 5; 6 |];;

> joinInto2D [| arr1; arr2 |];;
val it : int [,] = [[1; 2; 3]
                    [4; 5; 6]]

编辑:已经有一个函数可以实现这个功能了,太好了!我会保留这个答案,因为它仍然可能有用,例如如果您想将1D数组作为列连接(而不是行,这是array2D实现的行为)。


0

我认为没有内置的方法来处理这个问题。不过,你可以基于Array2D.initArray2D.blit定义自己的可重用方法。如果你需要将几列合并成一个逻辑整体,我认为使用数组的数组通常比使用2D数组更方便(而且一般来说,.NET中的1D数组操作比多维数组操作快得多)。


谢谢。这非常有帮助。我曾经认为F#中的数组数组与array2D相同。 - ahala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接