Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python连接来自多个netCDF文件的数据_Python_Arrays_Numpy_Append_Netcdf - Fatal编程技术网

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

如何使用Python连接来自多个netCDF文件的数据,python,arrays,numpy,append,netcdf,Python,Arrays,Numpy,Append,Netcdf,我有一些netCDF文件,24个用于每个方向(x,y,z),24个用于不同时间的值。在最后一点,我必须绘制所有时间步的数据 对于绘图,我需要在特定点进行插值,因此我必须知道最近的邻居。我的计划是将数据分成3D单元,这样我就不必在整个数据集中搜索最近的邻居 因此,在我的第一步中,我读取数据文件并创建一个数组,其中包含每个点的坐标和每次的值 然后,我为每个点计算它所属的单元,并将其附加到4维数组中:x、y、z和v: for vec in vecs: x_ind = int((vec[0]-x

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

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

因此,在我的第一步中,我读取数据文件并创建一个数组,其中包含每个点的坐标和每次的值

然后,我为每个点计算它所属的单元,并将其附加到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]

当我只使用一个时间步时,它就工作了,但是如果我重新计算每个时间步的单元格和最近邻,并且它们不会随着时间的推移而改变位置,我会有很大的超速。如果您事先知道要使用的阵列的形状,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数组中,并根据需要附加到该数组中。

这不是你的问题,但你为什么不使用scipy.spatial.cKDTree,你似乎在重新发明轮子?另外,scipy.ndimage还有一些插值,可能已经实现了您想要的功能。不过,最简单的解决方案是,创建一个大数组,该数组已经足够大,可以容纳所有内容。