在F#中,array.append可以连接两个数组;有没有办法将2个array2D对象附加到一个或列中,将几个1-D数组连接成一个array2D对象?
答案 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.init
或Array2D.blit
定义自己的可重用方法。如果你需要将几个列组合成一个逻辑整体,我认为使用数组数组而不是2D数组通常更方便(通常,.NET中的一维数组操作明显快于多数维数组运算)。