1

我是 python 新手,如果已经问过这个问题,我深表歉意。

使用 python 和 numpy,我试图通过迭代调用将许多 netcdf 文件中的数据收集到一个数组中append()

天真地,我正在尝试做这样的事情:

from numpy import *
from pupynere import netcdf_file

x = array([])
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x = append(x, xFragment)

我知道在正常情况下这是一个坏主意,因为它会在每次append()调用时重新分配新内存。但是有两件事不鼓励对 x 进行预分配:

1) 文件沿轴 0 的大小不一定相同(但沿后续轴的大小应相同),因此我需要事先从每个文件中读取数组大小以预先计算 x 的最终大小。

然而...

2)据我所知,pupynere(和其他 netcdf 模块)在打开文件时将整个文件加载到内存中,而不仅仅是一个引用(例如其他环境中的许多 netcdf 模块)。所以要预先分配,我必须打开文件两次。

据我所知,有许多 (>100) 大 (>1GB) 文件,因此过度分配和重塑是不切实际的。

我的第一个问题是我是否错过了一些预分配的智能方法。

我的第二个问题更严重。上面的代码片段适用于一维数组。但是如果我尝试加载一个矩阵,那么初始化就会成为一个问题。我可以将一维数组附加到一个空数组:

append( array([]), array([1, 2, 3]) )

但我不能将空数组附加到矩阵:

append( array([]), array([ [1, 2], [3, 4] ]), axis=0)

我相信像 x.extend(xFragment) 这样的东西会起作用,但我认为 numpy 数组没有这个功能。我也可以通过将第一个文件视为特殊情况来避免初始化问题,但如果有更好的方法,我更愿意避免这种情况。

如果有人可以提供帮助或建议,或者可以发现我的方法存在问题,那么我将不胜感激。谢谢

4

1 回答 1

1

您可以通过首先将文件文件中的数组加载到数组列表中,然后使用连接连接所有数组来解决这两个问题。像这样的东西:

x = [] # a normal python list, not np.array
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x.append(xFragment)

combined_array = concatenate(x, axis=0)
于 2010-04-15T06:35:11.103 回答