2010-04-15 43 views
1

我是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数组有这个功能。我还可以通过将第一个文件视为特殊情况来避免初始化问题,但如果有更好的方法,我宁愿避免这种情况。

如果任何人都可以提供帮助或建议,或者可以通过我的方法发现问题,那么我会很感激。谢谢

回答

1

您可以通过先将文件文件中的数组加载到数组列表中,然后使用concatenate来加入所有数组来解决这两个问题。事情是这样的:

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) 
+0

的NetCDF数据来作为numpy的阵列,因此这将创建数组列表如下: [阵列(...),阵列(...),阵列(.. 。)...] for each append statement。也许如果我首先将numpy数组转换为常规列表,然后回到最后的numpy数组,那么这会工作吗? – 2010-04-15 06:57:11

+0

尝试了这个想法后,我决定这可能不是我要找的。我不得不每次迭代都调用xFragment.tolist(),这在第一次迭代中将x设置为xFragment并在随后的迭代中使用x.append(xFragment)似乎没有改进。 – 2010-04-15 07:34:49

+0

x将是NumPy数组的列表。这正是concatenate期望得到的。 – 2010-04-15 10:52:48