Collections F中的文本分析和嵌套集合转换#
我解析csv文件中的数据,如下所示: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);(
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类型提供程序?你能提供一个你拥有的具体输入和你想要得到的具体输出的例子吗?我有点迷路了:-)。此外,如果没有可运行的源代码,就有点难以回答-如果您可以共享在某处运行的版本,这将非常有用。