F#Array2D切片

aha*_*ala 4 f#

是否可以在F#中对Array2D进行切片?说, let tmp =Array2D.init 100 100 (fun x y -> x * 100 + y)

如何检索一些列或tmp类似的行tmp.[0,1..]

cfe*_*ern 8

从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)


kvb*_*kvb 6

是.抓取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)


Inf*_*num 5

你自己已经给出了答案。

您问题中的示例代码将为您提供您想要的内容。我只是稍微改变了它以更好地表明它的工作原理。

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,旧版本未测试。


Oen*_*ria 5

在 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