2012-02-21 7 views
2

私は(四面体)セル、その(三角形の)面、エッジ、ノードからなる非構造化メッシュを、直感的かつ効率的な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つの配列をジップアップする必要があります。

参考にしてください。

+0

「あなたが後で私が[フィールド]を追加したいと思うとしたら、それはあなたが心配していることですか? cells_dtypeにフィールドを追加する際に一致する既存のコードを変更するのは難しいですか?以前の形式で以前にシリアル化されたデータを変換するのは難しいですか?同じプログラム内のセルデータに2つの異なるdtypeを使用することの難しさ? – Weeble

+0

ああ、私はフィールドを効率的に追加する方法が今はないということです。もちろん、拡張されたdtypeを使って完全な新しい配列を作成し、古いエントリをビット単位で埋め戻すこともできますが、これは非効率的です。 –

+0

私はまだあなたが "効率"という意味を理解していません。実行時にこれを行うことについて話しているのですが、配列をコピーするCPUとメモリのコストが心配ですか、または数字でいっぱいのソースファイルを編集することについて話しています。編集に時間がかかることを心配しています彼らはあなたのストレージ構造を変更するたびに?または、後でフィールドを追加または削除する場合に変更する必要があるコードの量を最小限に抑えるように、コードの残りの部分を書き込む方法にほとんど興味がありますか? – Weeble

答えて

0

まず第一に、私は実際にはナンバーワンのエキスパートではないと言います。おそらくあなたが描いていることをする方法はありませんが、おそらくあなたが考えるように大きな問題ではないと思います。

フィールドを追加したいが、データの移動は避けたい。私はそれができないと思う。あなたのオプションは以下の通りです:

  1. おそらく、どのメッシュに余分なフィールドが必要なのでしょうか?そうであれば、それらを事前に割り当てて、配列に余分なフィールドが存在するかどうかにかかわらず使用できるように、操作する必要のないフィールドを無視するようにアルゴリズムを慎重に記述することができます。

  2. すべてのセルに同じdtypeを使用し、フィールドが使用されていない場合は無視してください。メモリを無駄にしますが、かなり簡単です。可能な場合は、

  3. フィールドを追加する必要がある場合は、別のdtypeで再割り当てしてください。これにはコピーが含まれますが、コピーのコストが問題になるほど頻繁にこれを行いますか? numpy配列のコピーは、同じデータをPython for forループと比較するとかなり速いです。

  4. 提案するとおり、フィールドごとに別々の単純な配列を作成してください。これにはPythonベースのループを圧縮する必要があるかもしれませんが、それはあなたが実行している主な処理ではないと思われるでしょうか?ほとんどの場合、Python forループのnumpy配列をループすると、おそらくnumpyから多くの利益を得ることはできません。

関連する問題