F#阵列2D切片
是否可以在F#中切片阵列2d? 说,F#阵列2D切片,f#,F#,是否可以在F#中切片阵列2d? 说, 让tmp=Array2D.init 100 100(乐趣x y->x*100+y) 如何从tmp中检索一些列或行,如tmp.[0,1..]?是的,可以尝试此tmp.[0..0,1..] let tmp = Array2D.init 100 100 (fun x y -> x * 100 + y) printf "%A" tmp.[1..2, ..3] [[100; 101; 102; 103] [200; 201; 202; 203]] 如果只需
让tmp=Array2D.init 100 100(乐趣x y->x*100+y)
如何从
tmp
中检索一些列或行,如tmp.[0,1..]
?是的,可以尝试此tmp.[0..0,1..]
let tmp = Array2D.init 100 100 (fun x y -> x * 100 + y)
printf "%A" tmp.[1..2, ..3]
[[100; 101; 102; 103]
[200; 201; 202; 203]]
如果只需要一行或一列,则必须重复该数字
[1..1, 2..3]
[1..2, 2..2]
如果你想达到或超过这个数字,就把这个数字删掉
[1.., 2..3]
[..2, 2..2]
数组切片始终返回相同的顺序数组
> tmp.[1..1, 2..2]
val it : int [,] = [[102]]
> tmp.[1..1, 2..2].[0, 0]
val it : int = 102
对。抓取二维块很容易:
tmp.[10..20,30..40]
但是,如果您想要1D切片,我相信您需要将其从2D切片中投影出来
tmp.[0..0,1..] |> fun arr -> Array.init 99 (fun i -> arr.[0,i])
当从二维数组中提取一维剖面时,我发现使用
Seq.Cast
非常方便。它从二维数组中按左右/上下顺序生成元素
像这样:
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
设A=array2D[[1;2;3];[4;5;6];[7;8;9]]
让我们把(A:'A[,])=A |>顺序演员展平你自己已经给出了答案
问题中的示例代码将为您提供所需的内容。
我只是稍微改变了一下,以更好地证明它是有效的
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]
;;
这里的关键是对行或列使用单个值。然后,它会将一个切片作为1D数组提供给您。如果对行和列都使用范围,则得到的切片类型为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]
(请参阅)太好了,然后我也会翻页和其他东西。也许你应该补充一点,这是一个新的F#功能-问题有点老了-但仍然是一个有价值的更新-谢谢你再次浏览这些旧东西!Thx,如果我知道的话我会的。我使用的是Visual F#3.1.1,它可以工作-不知道旧版本。有没有一种有效的方法来获得对角线?
// Get row 3 from a matrix as a vector:
matrix.[3, *]
// Get column 3 from a matrix as a vector:
matrix.[*, 3]