2012-08-27 32 views
1

我有一些netCDF文件,每个方向(x,y,z)和24与不同时间的值。在最后一点,我必须绘制所有时间步骤的数据。如何连接多个netCDF文件与Python的数据

对于绘图我需要插入特定点,所以我必须知道最近的邻居。我的计划是将数据分成三维单元格,因此我不必在整个数据集中搜索最近的邻居。

所以在我的第一步中,我读了我的数据文件,并创建一个数组女巫包含每个点的坐标和每次的值。

之后我计算每个点的小区属于并将其追加到4种尺寸的阵列:xyzv

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

它不是你的问题,但你为什么不使用scipy.spatial.cKDTree,你似乎重新发明了轮子?另外scipy.ndimage有一些插值可能已经做到了你想要的。尽管如此,最简单的解决方案就是创建一个已经足够容纳_everything_的大数组。 – seberg

回答

1

如果您知道先验您将使用的阵列的形状,Numpy通常会方便得多。像附加到数组的东西遭受性能损失。我同意塞巴斯蒂安的观点,最简单的方法(如果可能的话)是创建一个足够容纳一切的数组(最糟糕的情况)。如果这是不可能的,那么也许你可以尝试使用对象数组。例如,创建具有3个空间维度对象数组:

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

(与同为YGridPointsZGridPointsVGridPoints)然后可以设置XGridPoints[z_ind, y_ind, x_ind]到numpy的阵列和根据需要追加到该阵列。