2010-04-15 40 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