Collections F中的文本分析和嵌套集合转换#

Collections F中的文本分析和嵌套集合转换#,collections,f#,nested,text-parsing,transpose,Collections,F#,Nested,Text Parsing,Transpose,我解析csv文件中的数据,如下所示: X,..,..,Dx,..,.. Y,..,..,Dy,..,.. X,..,..,Dx,..,.. Y,..,..,Dy,..,.. X,..,..,Dx,..,.. Y,..,..,Dy,..,.. 每一行都是我定义并与FileHelper一起使用的类型的数组的一个元素。这可能与此无关,但我将包括这一点,以防有人知道我可以在这个阶段使用FileHelper执行的一个技巧 我只对X,Dx和Y,Dy对感兴趣 数据可能不仅仅是X&Y,例如。。(X,Dx);(

我解析csv文件中的数据,如下所示:

X,..,..,Dx,..,..
Y,..,..,Dy,..,..
X,..,..,Dx,..,..
Y,..,..,Dy,..,..
X,..,..,Dx,..,..
Y,..,..,Dy,..,..
每一行都是我定义并与FileHelper一起使用的类型的数组的一个元素。这可能与此无关,但我将包括这一点,以防有人知道我可以在这个阶段使用FileHelper执行的一个技巧

我只对X,Dx和Y,Dy对感兴趣 数据可能不仅仅是X&Y,例如。。(X,Dx);(Y,Dy);(Z,Dz)

我会叫字母nL的号码

目标是得到Dx,Dy。。。对于每个组,通过处理所有D的数组,该数组具有和(n运算)*nL元素

我有一个迭代次数列表:

let nIterations = [2000; 2000; 2000; 1000; 500; 400; 400; 400; 300; 300]
对于这些数字中的每一个,我都会有那么多的“字母组”。因此,对nIterations[0]感兴趣的数据行是0到(nIterations[0]*nL)行

为了获得感兴趣的硝化行。[i],我创建了一个列表“nis”,它是对硝化执行的扫描操作的结果

let nis = List.scan (fun x e -> x + e) 0 nIterations
然后分离出硝基组

let group = Array.sub Ds (nis.[i]*nL) (nIterations.[i]*nL)
事情是这样的:

nIterations |> List.mapi (fun i ni ->
    let igroup = Array.sub Ds (nis.[i]*nL) (ni*nL)
    let groupedbyLetter = (chunk nL igroup)

    let sums = seq { for idx in 0..(nL - 1) do
                         let d = seq { for g in groupedbyLetter do 
                                           yield (Seq.head (Seq.skip idx g)) }
                         yield d |> Seq.sum }

    sums |> Seq.map (fun x -> (x / (float ni))) ) |> List.ofSeq
“chunk”函数是我在上面找到的,所以:

let rec chunk n xs =
    if Seq.isEmpty xs then Seq.empty
    else
        let (ys,zs) = splitAt n xs
        Seq.append (Seq.singleton ys) (chunk n zs)
我已经验证了这一点,并得到了我想要的东西-一个大小nL的大小N的集合。长度集合

问题是速度——这只适用于小数据集;我在示例中使用的尺寸太大。它在chunk函数处被“挂起”

所以我的问题是:我如何提高整个过程的速度?(和/或)进行“换位”的最佳(或至少更好)方法是什么

我想我可以:

  • 在我读取数据时,尝试重新排列数据
  • 尝试直接索引元素
  • 尝试将流程分成更小的阶段或“过程”
    • 我明白了

      let averages =
          (nIterations |> List.mapi (fun i ni ->
              let igroup = Array.sub Ds (nis.[i]*nL) (ni*nL)
              let groupedbyLetter = 
                  [| for a in 1..nL..igroup.Length do 
                         yield igroup.[(a - 1)..(a - 1)+(nL-1)] |]
      
              [| for i in 0..(nL - 1) do
                     yield [| for j in 0..(groupedbyLetter.Length - 1) do
                                  yield groupedbyLetter.[j].[i] |] 
                     |> Array.average |]) )
      
      let columns = [| for i in 0..(nL - 1) do
                           yield [| for j in 0..(nIterations.Length - 1) do
                                        yield averages.[j].[i] |] 
                           |]
      
      “columns”函数只是再次转换数据,以便我可以轻松打印

                     ----Average Ds----
      nIterations       X    Y    Z
         2000          0.2  0.7  1.2
          ...          ...  ...  ...
          ...          ...  ...  ...
      
      e、 g.平均回报率

      [[x1,y1,z1,..], [x2,y2,z2,..], ... ]
      
      专栏给了我

      [ [x1,x2,..], [y1,y2,..], [z1,z2,..], ...]
      
      我明白了

      let averages =
          (nIterations |> List.mapi (fun i ni ->
              let igroup = Array.sub Ds (nis.[i]*nL) (ni*nL)
              let groupedbyLetter = 
                  [| for a in 1..nL..igroup.Length do 
                         yield igroup.[(a - 1)..(a - 1)+(nL-1)] |]
      
              [| for i in 0..(nL - 1) do
                     yield [| for j in 0..(groupedbyLetter.Length - 1) do
                                  yield groupedbyLetter.[j].[i] |] 
                     |> Array.average |]) )
      
      let columns = [| for i in 0..(nL - 1) do
                           yield [| for j in 0..(nIterations.Length - 1) do
                                        yield averages.[j].[i] |] 
                           |]
      
      “columns”函数只是再次转换数据,以便我可以轻松打印

                     ----Average Ds----
      nIterations       X    Y    Z
         2000          0.2  0.7  1.2
          ...          ...  ...  ...
          ...          ...  ...  ...
      
      e、 g.平均回报率

      [[x1,y1,z1,..], [x2,y2,z2,..], ... ]
      
      专栏给了我

      [ [x1,x2,..], [y1,y2,..], [z1,z2,..], ...]
      

      您是否尝试过使用csv类型提供程序?你能提供一个你拥有的具体输入和你想要得到的具体输出的例子吗?我有点迷路了:-)。另外,如果没有可运行的源代码,这也有点难以回答-如果您可以共享在某处运行的版本,这将非常有用。您是否尝试过使用csv类型提供程序?你能提供一个你拥有的具体输入和你想要得到的具体输出的例子吗?我有点迷路了:-)。此外,如果没有可运行的源代码,就有点难以回答-如果您可以共享在某处运行的版本,这将非常有用。