我是 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 数组没有这个功能。我也可以通过将第一个文件视为特殊情况来避免初始化问题,但如果有更好的方法,我更愿意避免这种情况。
如果有人可以提供帮助或建议,或者可以发现我的方法存在问题,那么我将不胜感激。谢谢