如何使用Python连接多个netCDF文件中的数据

时间:2012-08-27 15:26:29

标签: python arrays numpy append netcdf

我有一些netCDF文件,每个方向24个(xyz)和24个不同时间的值。在最后一点,我必须绘制所有时间步骤的数据。

对于绘图我需要在特定点插值,所以我必须知道最近的邻居。我的计划是将数据划分为3D单元格,这样我就不必在整个数据集中搜索最近的邻居。

所以在我的第一步中,我读入了我的数据文件并创建了一个数组,其中包含[x,y,z,v[:]]每个点的坐标和每次的值。

之后,我为每个点计算它所属的单元格,并将其附加到包含4个维度的数组:xyzv:< / p>

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]

当我只采取一个步骤时,它正在工作,但如果我为每个时间步重新计算单元格和最近邻居,并且它们不随时间改变位置,则会产生大的过载。

1 个答案:

答案 0 :(得分:2)

如果您知道先验您将使用的阵列的形状,Numpy通常会更方便。附加到阵列之类的东西会受到性能损失。我同意Sebastian的观点,最简单的方法(如果可能的话)是创建一个足以容纳所有东西的数组(最坏的情况)。如果这是不可能的,那么也许您可以尝试使用对象数组。例如,创建一个具有3个空间维度的对象数组:

import numpy as N
XGridPoints = N.empty((nx, ny, nz), dtype='object')

(对于YGridPointsZGridPointsVGridPoints也是如此。)然后,您可以将XGridPoints[z_ind, y_ind, x_ind]设置为numpy数组,并根据需要附加到该数组。