gpt4 book ai didi

netcdf - 使用 ncrcat 连接多个 netcdf 文件时如何识别每个文件的来源?

转载 作者:行者123 更新时间:2023-12-02 09:50:18 33 4
gpt4 key购买 nike

我正在连接 1000 个 nc 文件(模拟的输出),以便我可以在 Matlab 中更轻松地处理它们。为此,我使用 ncrcat。文件具有不同的大小,并且文件之间的时间变量不是唯一的。连接效果很好,使我能够比单独读取文件更快地将数据读入 Matlab。但是,我希望能够识别每个数据点源自的原始 nc 文件。是否可以将源文件名添加为额外变量,以便我可以追溯数据?

最佳答案

最简单的方法:在线索引

在我们开始之前,我会使用整数索引而不是文件名来标识每次运行,因为它更容易处理,无论是编写还是在 matlab 程序中处理。标识符不是简单的单调递增索引,而是可以与您的运行相关(或者您甚至可以根据需要编写多个单独的索引(例如,您可能有一个代表分辨率、日期、模型版本等的数字)。

因此,我能想到的最明显的方法是每个模拟都向文件写入一个索引以识别自身。即第一个模型运行将写入一个变量

myrun=1

第二个

myrun=2

等等......然后当您对文件进行cat时,可​​以使用此索引非常轻松地唯一标识数据。

请注意,如果您的空间维度不是唯一的,并且时间步数也根据您所编写的运行而变化,则您的索引将需要是所有非唯一维度的函数,例如myrun(x,y,t)。如果您的任何维度在所有文件中都是唯一的,则该维度在索引中是多余的,可以省略。

当然,此解决方案的唯一问题是它意味着再次运行模拟 :-D 并且您可能正在谈论运行昂贵的模型或您无法重复的其他人的运行。如果无法重新运行,您将需要尝试离线添加索引...

离线索引(如果网格相同则容易,否则更复杂)

如果所有文件的空间维度都相同,那么这仍然是一项简单的任务,因为您可以在所有时间步中轻松添加离线索引使用 nco 的每个文件:

ncap2 -s 'myrun[$time]=array(X,0,$time)' infile.nc  outfile.nc

或者如果您愿意覆盖原始文件(小心!)

ncap2 -O -s 'myrun[$time]=array(X,0,$time)'

其中 X 是运行编号。这将添加一个变量,其中包含一个新变量 myrun,它是时间的函数,然后在每个步骤中添加 X。合并时,您可以看到哪个数据切片来自哪个特定运行。

顺便说一下,第二个零是增量,因为它被设置为零,所以数字 X 将为给定文件中的所有时间步长写入(否则,如果它是 1,则索引将在每个时间步长上增加 1 - 这在某些情况下可能很有用。例如,您可以使用两个索引,一个以零增量来标识运行,第二个以单位增量来轻松告诉您数据切片属于第 X 次运行的哪一步) 。

如果您的文件也适用于不同的域,那么您可能希望在执行此操作之前将它们放在公共(public)网格上......我认为是这样

cdo enlarge 

可能有帮助,请参阅这篇文章:https://code.mpimet.mpg.de/boards/2/topics/1459

关于netcdf - 使用 ncrcat 连接多个 netcdf 文件时如何识别每个文件的来源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56529646/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com