是否可以在F#中对Array2D进行切片?说,
let tmp =Array2D.init 100 100 (fun x y -> x * 100 + y)
如何检索一些列或tmp
类似的行tmp.[0,1..]
?
从2D数组中提取1D部分时,我发现它很方便使用Seq.Cast<T>
.它以左右/上下顺序从2D数组中生成元素.
像这样:
let A = array2D [[1;2;3];[4;5;6];[7;8;9]]
let flatten (A:'a[,]) = A |> Seq.cast<'a>
let getColumn c (A:_[,]) =
flatten A.[*,c..c] |> Seq.toArray
let getRow r (A:_[,]) =
flatten A.[r..r,*] |> Seq.toArray
Run Code Online (Sandbox Code Playgroud)
以及FSI的一个例子:
> flatten A;;
val it : seq<int> = seq [1; 2; 3; 4; ...]
> getRow 2 A;;
val it : int array = [|7; 8; 9|]
> getColumn 0 A;;
val it : int array = [|1; 4; 7|]
Run Code Online (Sandbox Code Playgroud)
是.抓取2D块很容易:
tmp.[10..20,30..40]
Run Code Online (Sandbox Code Playgroud)
但是,如果你想要一维切片,我相信你需要将它从2D切片中投射出来
tmp.[0..0,1..] |> fun arr -> Array.init 99 (fun i -> arr.[0,i])
Run Code Online (Sandbox Code Playgroud)
你自己已经给出了答案。
您问题中的示例代码将为您提供您想要的内容。我只是稍微改变了它以更好地表明它的工作原理。
let tmp = Array2D.init 10 10 (fun x y -> sprintf "%d,%d" x y)
//3rd row
let row3 = tmp.[2,0..]
//2nd column
let col2 = tmp.[0..,1]
;;
Run Code Online (Sandbox Code Playgroud)
这里的关键是对行或列使用单个值。然后它为您提供一个作为一维数组的切片。如果您对行和列都使用范围,那么您将获得 Array2D 类型的切片。
编辑:适用于 Visual F# 3.1.1,旧版本未测试。
在 F# 3.1 中,你可以这样做:
// Get row 3 from a matrix as a vector:
matrix.[3, *]
// Get column 3 from a matrix as a vector:
matrix.[*, 3]
Run Code Online (Sandbox Code Playgroud)
(参见https://msdn.microsoft.com/en-us/library/dd233214.aspx?f=255&MSPPError=-2147217396)