在 F# 中,array.append 可以将两个数组连接起来;是否有一种方法可以将 2 个 array2D 对象附加到一个对象中,或者将多个 1-D 数组按列连接成一个 array2D 对象?
array2D函数可以将任何seq<#seq<'T>>
转换成'T [,]
,因此它适用于将一堆1D数组转换为2D数组。
let arr1 = [| 1; 2; 3 |]
let arr2 = [| 4; 5; 6 |]
let combined = array2D [| arr1; arr2 |]
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
实现的行为)。
我认为没有内置的方法来处理这个问题。不过,你可以基于Array2D.init
或Array2D.blit
定义自己的可重用方法。如果你需要将几列合并成一个逻辑整体,我认为使用数组的数组通常比使用2D数组更方便(而且一般来说,.NET中的1D数组操作比多维数组操作快得多)。