私は(四面体)セル、その(三角形の)面、エッジ、ノードからなる非構造化メッシュを、直感的かつ効率的なPythonデータ構造に収めようとしています。 データ構造が答えることができる質問は、「ノードkの座標は何ですか?」、「どの辺がセルjにあるか」、「どのセルが面iに隣接していますか?等々。dtypeを拡張しますか?リストとリレーションシップに最適なデータ構造
私の最初の推測では、など
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にあなたのノードを与えるだろう。
私は現時点で見ることができる1つの欠点があります: 配列は拡張できません。私が後でランタイムに、顔や辺に関する情報を追加したいと決めたとします。どのようにデータを移動することなくセル配列にフィールドを追加できますか?つまり、dtypesの配列を動的に拡張する方法は?
回避策は、
cells_nodes = ...
cells_faces = ...
cells_edges = ...
として別々のアレイを作成し、必要に応じてそれらを充填することであろう。しかし、これはあまり慣れないようです。たとえば、ノード、面、およびエッジが必要なセルをループすると、3つの配列をジップアップする必要があります。
参考にしてください。
「あなたが後で私が[フィールド]を追加したいと思うとしたら、それはあなたが心配していることですか? cells_dtypeにフィールドを追加する際に一致する既存のコードを変更するのは難しいですか?以前の形式で以前にシリアル化されたデータを変換するのは難しいですか?同じプログラム内のセルデータに2つの異なるdtypeを使用することの難しさ? – Weeble
ああ、私はフィールドを効率的に追加する方法が今はないということです。もちろん、拡張されたdtypeを使って完全な新しい配列を作成し、古いエントリをビット単位で埋め戻すこともできますが、これは非効率的です。 –
私はまだあなたが "効率"という意味を理解していません。実行時にこれを行うことについて話しているのですが、配列をコピーするCPUとメモリのコストが心配ですか、または数字でいっぱいのソースファイルを編集することについて話しています。編集に時間がかかることを心配しています彼らはあなたのストレージ構造を変更するたびに?または、後でフィールドを追加または削除する場合に変更する必要があるコードの量を最小限に抑えるように、コードの残りの部分を書き込む方法にほとんど興味がありますか? – Weeble