2012-02-21 71 views
2

我試圖將由(四面體)單元,它們的(三角形)面,邊和節點組成的非結構化網格放入Python數據結構中,該結構既直觀又高效。 數據結構需要能夠回答的問題是「節點k的座標是什麼?」,「單元格j中的哪些邊?」,「哪個單元格與我相鄰?」等等。擴展dtypes?列表和關係的最佳數據結構?

我的第一個猜測是去像

nodes_coords = np.array(num_nodes, dtype=np.dtype((float,3))) 
cells_dtype = np.dtype([('nodes', (int,4))]) 
cells = np.array(num_cells, dtype=cells_dtype) 

等等。 這樣做的好處是,有越來越小區節點關係的一個非常直觀的方式,即

cells[4]['nodes'] 

會給你的節點在小區#4。

有一個缺點我可以在此刻看到: 數組不能擴展。假設我稍後在運行時決定添加關於面和邊的信息;我如何在不移動數據的情況下將字段添加到單元格數組中,即如何動態地擴展數組的dtypes?

一個變通是創建單獨的陣列,如

cells_nodes = ... 
cells_faces = ... 
cells_edges = ... 

,並請他們在有需要時。這雖然看起來不太習慣。例如,循環遍歷需要節點,面和邊的單元格,每次都需要壓縮三個數組。

有用的建議,任何人?

+0

當你說「假設我稍後決定我想添加[fields]」時,你究竟擔心什麼?將字段添加到cells_dtype時,難以修改現有代碼以匹配嗎?轉換之前以舊格式序列化的數據的難度?在同一程序中使用兩種不同的dtypes作爲細胞數據的困難? – Weeble 2012-02-21 12:49:28

+0

哦,我的意思是我現在不怎麼高效地添加字段。我當然可以繼續創建一個擴展dtype的全新數組,並將舊條目一點一點地填滿,但這似乎效率低下。 – 2012-02-21 13:15:51

+0

我還是不太明白「效率」是什麼意思。您是否正在討論在運行時這樣做,並且您擔心複製陣列的CPU和內存成本,或者您是否在討論編輯源文件充滿數字的問題,並且擔心編輯時間會讓您編輯他們每當你改變你的存儲結構?或者,您是否最感興趣的是如何編寫代碼的其餘部分,以便稍後添加或刪除字段時可以最小化需要更改的代碼量? – Weeble 2012-02-21 14:39:05

回答

0

首先,我會說我不是一個真正的裸體專家。我認爲雖然可能沒有辦法做你所描述的事情,但它可能不像你想象的那麼大。

正如您所描述的那樣,您希望添加字段,但您希望避免移動數據。我認爲這是不可能的。你的選擇是:

  1. 也許你事先知道哪些網格需要額外的域?如果是這樣,您可以預先分配它們,並仔細編寫算法以忽略不需要操作的字段,以便可以使用它們而不管數組中存在哪些額外的字段。

  2. 只爲所有單元格使用相同的dtype,並在不使用時忽略這些字段。浪費一些記憶,但很容易。如果可能,

  3. 當您需要添加字段時,用不同的dtype重新分配。雖然這涉及到複製,但是您是否經常這樣做,使複製的成本成爲問題?複製numpy數組非常快,當然與Python對於相同數據的循環相比。

  4. 正如你所建議的那樣,爲每個字段保留單獨的簡單數組。雖然這可能會涉及基於Python的循環的壓縮,但這可能不是您對它們執行的主要處理類型,是嗎?如果主要在Python for循環中遍歷numpy數組,您可能沒有從numpy中獲得很多好處。