F#如何追加/加入array2D并将1D数组合并到array2D

时间:2010-03-02 23:31:55

标签: f#

在F#中,array.append可以连接两个数组;有没有办法将2个array2D对象附加到一个或列中,将几个1-D数组连接成一个array2D对象?

3 个答案:

答案 0 :(得分:6)

array2D function会将seq<#seq<'T>>变为'T [,],因此它可以将一堆1D数组转换为2D数组。

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

let combined = array2D [| arr1; arr2 |]

答案 1 :(得分:3)

据我所知,没有F#库函数会将多个1D数组转换为单个2D数组,但您可以使用Array2D.init编写自己的函数:

let joinInto2D (arrays:_[][]) = 
  Array2D.init arrays.Length (arrays.[0].Length) (fun i j ->
    arrays.[i].[j])

它需要一个数组数组,因此当你调用它时,你会给它一个包含你想要连接的所有数组的数组(例如[| arr1; arr2 |]来连接两个数组)。该函数将多个1D数组连接成一个2D数组,每个输入数组包含一行。它假定所有给定数组的长度相同(最好添加一个检查来验证,例如使用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实现的行为。

答案 2 :(得分:0)

我认为没有内置任何东西来处理这个问题。不过,您可以根据Array2D.initArray2D.blit定义自己的可重用方法。如果你需要将几个列组合成一个逻辑整体,我认为使用数组数组而不是2D数组通常更方便(通常,.NET中的一维数组操作明显快于多数维数组运算)。