我試圖將由(四面體)單元,它們的(三角形)面,邊和節點組成的非結構化網格放入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 = ...
,並請他們在有需要時。這雖然看起來不太習慣。例如,循環遍歷需要節點,面和邊的單元格,每次都需要壓縮三個數組。
有用的建議,任何人?
當你說「假設我稍後決定我想添加[fields]」時,你究竟擔心什麼?將字段添加到cells_dtype時,難以修改現有代碼以匹配嗎?轉換之前以舊格式序列化的數據的難度?在同一程序中使用兩種不同的dtypes作爲細胞數據的困難? – Weeble 2012-02-21 12:49:28
哦,我的意思是我現在不怎麼高效地添加字段。我當然可以繼續創建一個擴展dtype的全新數組,並將舊條目一點一點地填滿,但這似乎效率低下。 – 2012-02-21 13:15:51
我還是不太明白「效率」是什麼意思。您是否正在討論在運行時這樣做,並且您擔心複製陣列的CPU和內存成本,或者您是否在討論編輯源文件充滿數字的問題,並且擔心編輯時間會讓您編輯他們每當你改變你的存儲結構?或者,您是否最感興趣的是如何編寫代碼的其餘部分,以便稍後添加或刪除字段時可以最小化需要更改的代碼量? – Weeble 2012-02-21 14:39:05