如何使用 Python 连接来自多个 netCDF 文件的数据
Posted
技术标签:
【中文标题】如何使用 Python 连接来自多个 netCDF 文件的数据【英文标题】:How to concatenate data from multiple netCDF files with Python 【发布时间】:2012-08-22 02:42:12 【问题描述】:我有一些 netCDF 文件,每个方向有 24 个(x
、y
、z
)和 24 个不同时间的值。最后,我必须绘制所有时间步的数据。
对于绘图,我需要在特定点进行插值,因此我必须知道最近的邻居。我的计划是将数据分成 3D 单元格,这样我就不必在整个数据集中搜索最近的邻居。
所以在我的第一步中,我读取了我的数据文件并创建了一个数组,其中包含[x,y,z,v[:]]
每个点的坐标和每次的值。
之后,我为每个点计算它所属的单元格并将其附加到一个 4 维数组:x
、y
、z
和 v
:
for vec in vecs:
x_ind = int((vec[0]-xmin) / stepWidthX)
y_ind = int((vec[1]-ymin) / stepWidthY)
z_ind = int((vec[2]-zmin) / stepWidthZ)
if x_ind==gridPointsInXdirection:
x_ind = x_ind-1
if y_ind==gridPointsInYdirection:
y_ind = y_ind-1
if z_ind==gridPointsInZdirection:
z_ind = z_ind-1
#print z_ind, y_ind,x_ind
XGridPoints[z_ind, y_ind, x_ind] = np.append(XGridPoints[z_ind, y_ind, x_ind], vec[0])
YGridPoints[z_ind, y_ind, x_ind] = np.append(YGridPoints[z_ind, y_ind, x_ind], vec[1])
ZGridPoints[z_ind, y_ind, x_ind] = np.append(ZGridPoints[z_ind, y_ind, x_ind], vec[2])
VGridPoints[z_ind, y_ind, x_ind] = np.append(VGridPoints[z_ind, y_ind, x_ind], vec[3])
其中vecs
是包含所有数据点的数组。到目前为止它正在工作,但我现在的问题出在VGridPoints
:我有一长串值而不是数组列表。是否有解决方案将数组附加到数组元素,以便我以后可以访问它:
x = XGridPoints[2,3,4][2]
y = YGridPoints[2,3,4][2]
z = ZGridPoints[2,3,4][2]
v[:] = VGridPoints[2,3,4][2]
当我只采取一个时间步长时,它可以工作,但是如果我为每个时间步长重新计算单元格和最近的邻居并且它们不会随着时间的推移改变位置,我就会有很大的过载。
【问题讨论】:
这不是你的问题,但你为什么不使用 scipy.spatial.cKDTree,你似乎重新发明了***? scipy.ndimage 也有一些插值,可能已经做了你想要的。不过,解决您的问题的最简单方法是创建一个已经足够容纳所有东西的大数组。 【参考方案1】: 如果您先验知道要使用的数组的形状,Numpy 通常会更方便。像附加到数组这样的事情会受到性能损失。我同意 Sebastian 的观点,最简单的方法(如果可能的话)是创建一个足够大的数组来容纳所有东西(最坏的情况)。如果这是不可能的,那么也许您可以尝试使用对象数组。例如,创建一个具有 3 个空间维度的对象数组:
import numpy as N
XGridPoints = N.empty((nx, ny, nz), dtype='object')
(对于YGridPoints
、ZGridPoints
、VGridPoints
也是如此。)然后您可以将 XGridPoints[z_ind, y_ind, x_ind]
设置为一个 numpy 数组并根据需要附加到该数组。
【讨论】:
以上是关于如何使用 Python 连接来自多个 netCDF 文件的数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 cartopy 绘制来自 netcdf 文件的 4 维变量的数据