私はPython 3.6.2とnumpyで作業しています。より良いアルゴリズムやデータ構造を探して、IDからインデックスへの接続の変換を改善する
私は有限要素モデルと結果を視覚化するコードを書いています。
可視化コードでは、有限要素メッシュのノードと要素をインデックスで識別する必要があります(ゼロから始まり、ギャップなし)。入力モデルはIDに基づいており、ID空間に非常に大きなギャップを持つことがあります。
私はすべてのノードと要素を処理し、IDの代わりにインデックスを使用するように変更しています。
ノードは
です。最初のステップは、ノードとノード座標の配列を処理することです。これはソートされているので、特に座標を使って何もする必要はありません - 節点座標配列のインデックスを使用するだけです。しかし、IDベースではなくインデックスベースになるように要素の接続性を再定義する必要があります。これを行うには
は、Iは
、ノードIDの配列を反復し、次のコードの値としてキーとその指標として、それはIDだ使用辞書に各ノードを追加することにより、辞書を作成します
model.nodesそのIDによって
nodeCoordsをキーイング、Nodeオブジェクトのすべてを含む辞書である私は視覚化に後で使用するために節点座標を記憶する予め割り当てられnumpyのアレイです。それは私が
nodeIdIndexMapは私がキーとしてノードIDと値
としてnodeCoordsのインデックスを使用して移入辞書である私の要素を再定義するために、後で使用する必要があり、この配列のインデックスですコード:
nodeindex=0
node_id_index_map={}
for nid, node in sorted(model.nodes.items()):
nodeCoords[nodeIndex] = node.xyz
nodeIdIndexMap[nid] = nodeIndex
nodeIndex+=1
それから私は、インデックスを取得し、インデックスとIDを交換し、辞書内の各要素ノードのIDを見上げ、すべての要素を反復処理します。以下のコードの断片で
、
- tet4Elementsは、要素ID
- N1、N2、N3およびN4が保持事前に割り当てられnumpyのアレイである使用キーイング、型tet4のすべての要素を含む辞書であります要素ノード
- element.nodes [N] .nid要素ノードIDを取得
- N1 [tet4Index] = nodeIdIndexMap [element.nodes [0]以前に作成した辞書に要素ノードIDをルックアップ.nid fragmentを返し、対応するインデックスを返し、numpyに格納します配列
コード:
tet4Index = 0
for eid, element in tet4Elements.items():
id[tet4Index] = eid
n1[tet4Index] = nodeIdIndexMap[element.nodes[0].nid]
n2[tet4Index] = nodeIdIndexMap[element.nodes[1].nid]
n3[tet4Index] = nodeIdIndexMap[element.nodes[2].nid]
n4[tet4Index] = nodeIdIndexMap[element.nodes[3].nid]
tet4Index+=1
上記の作品が、それは遅いです......各tet4要素には4つのノードがあり、各ノードIDは辞書で検索されなければならないため、1600,000エントリの辞書で2,600万の辞書検索が行われます。
いくつかの点で私はC++に移動しますが、今、私はPythonでパフォーマンスを向上させるために探しています。
のために、私はパフォーマンスを向上させるための任意のアイデアに感謝でしょう?速くこれを行う方法である。
感謝、
ダグ
あなたは未定義の変数( '' nodeIndex''、 '' tet4Index''、 '' id''、 '' n1''、 '' tet4Elements''などの数を持っています)これにより、あなたのアルゴリズムが何をしようとしているのかを理解することが難しくなります。投稿を編集して[MCVE](https://stackoverflow.com/help/mcve)を提供してください。 – jakevdp
定義されていない変数のいくつかの定義を追加しました – max375
IDの総範囲は何ですか? –