我是python的新手,如果已经有人问道,我很抱歉。在numpy数组中扩展一系列不均匀的netcdf数据
使用python和numpy,我试图通过迭代地调用append()
将跨许多netcdf文件的数据收集到单个数组中。
天真,我试图做这样的事情:
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数组有这个功能。我还可以通过将第一个文件视为特殊情况来避免初始化问题,但如果有更好的方法,我宁愿避免这种情况。
如果任何人都可以提供帮助或建议,或者可以通过我的方法发现问题,那么我会很感激。谢谢
的NetCDF数据来作为numpy的阵列,因此这将创建数组列表如下: [阵列(...),阵列(...),阵列(.. 。)...] for each append statement。也许如果我首先将numpy数组转换为常规列表,然后回到最后的numpy数组,那么这会工作吗? – 2010-04-15 06:57:11
尝试了这个想法后,我决定这可能不是我要找的。我不得不每次迭代都调用xFragment.tolist(),这在第一次迭代中将x设置为xFragment并在随后的迭代中使用x.append(xFragment)似乎没有改进。 – 2010-04-15 07:34:49
x将是NumPy数组的列表。这正是concatenate期望得到的。 – 2010-04-15 10:52:48