我是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