저는 파이썬 3.6.2 및 numpy로 작업하고 있습니다.ID에서 인덱스로의 연결 변환을 향상시키는 더 나은 알고리즘 또는 데이터 구조 찾기
유한 요소 모델과 결과를 시각화하는 코드를 작성하고 있습니다.
시각화 코드는 유한 요소 메쉬 노드와 요소가 색인으로 식별되어야하지만 (0으로 시작하고 틈이 없음) 입력 모델은 ID를 기반으로하며 ID 공간에 매우 큰 간격을 가질 수 있습니다.
그래서 모든 노드와 요소를 처리하고 ID 대신 색인을 사용하도록 변경하고 있습니다.
노드는
첫 단계는 노드와 노드 좌표의 배열을 처리하는 것입니다. 이것은 저에게옵니다. 그래서 좌표를 가지고 특별히 아무것도 할 필요가 없습니다 - 저는 꼭지 좌표 배열의 인덱스를 사용합니다. 하지만 ID 기반 대신 인덱스 기반으로 요소의 연결을 재정의해야합니다.
이렇게하려면, I는
을 노드 ID의 배열을 반복하고이 값과 키 인덱스 다음의 코드에같은 ID를 이용하여 사전에 각 노드를 추가하여 사전을 만들
model.nodes 자신의 ID가
nodeCoords 열쇠 노드의 모든 객체를 포함하는 사전 I 시각화에 나중에 사용하기 위해 노드 좌표를 미리 할당 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는
- N1, N2, N3 및 N4는 길게 사전 할당 NumPy와 배열되는 요소 ID를 이용하여 키가 입력 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는 사전에서 조회해야하므로 사전에 1,600,000 개 항목의 사전에서 2,600,000 개의 사전 조회가 이루어집니다.
그래서 질문은 6,500,000 개의 tet4 요소를 처리하는 데 약 16 초가 걸립니다. 내가 C로 이동합니다 ++하지만 지금 내가 파이썬에서 성능을 향상시키기 위해 찾고 있어요 어떤 점에서? 빨리이 작업을 수행하는 방법이다.
어떤 아이디어가 성능을 향상시키기 위해 내가 감사 할 것입니다.
감사합니다 ,
더그
,''tet4Elements'' 등) 이것은 알고리즘이 무엇을 시도 하는지를 이해하기 어렵게 만듭니다. 게시물을 수정하고 [MCVE] (https://stackoverflow.com/help/mcve)를 제공하십시오. – jakevdp
정의되지 않은 변수에 대한 정의가 일부 추가되었습니다. – max375
총 ID 수는 얼마입니까? –