2014-08-29 3 views
0

짧은 이야기입니다 : 논리 0 또는 다른 방법을 사용하여 배열에서 정확한 지점을 삭제하려고합니다.numpy 배열 값 (논리 0)을 삭제하십시오.

나는 날개를 정의하는 몇 점의 좌표로 시작합니다. 그 (것)들과, 나는 교차 선없이 좋은 다각형을 형성하는 것을 시도하고있다. 이것은 점 1 (임의의 한 점)에서 시작하여 다음 점을 첫 번째 점에 가장 가까운 점으로 채움으로써 수행됩니다.

좌표는 xEdge 및 yEdge로로드됩니다. 내가하는 첫 번째 일은 다음과 같이 그 안에 0 만있는 복사본을 만드는 것입니다. xEdgeOrdered 및 yEdgeOrdered는 다각형 점으로 채워집니다. 또한 어떤 값이 이미 다각형에 의해 검사되었는지를 확인하는 데 사용될 것 인 객체로만 하나를 만들 것입니다.

예를 들어 y- 최대 값으로 폴리곤을 시작하면 여기에서 문제가 시작됩니다. 나는 [시작 인덱스] = 0 NOTUSED 상태 마지막 줄에서

startIndex = np.argmax(yEdge) 
xEdgeOrdered[0] = xEdge[startIndex] 
notUsed[startIndex] = 0 

는, 내가 정말 할 노력하고있어 논리 0으로 "사용 된"값을 대체입니다 - MATLAB에서 "거짓". 이 값은 더 이상 도달 할 수 없으며 배열에서 기본적으로 삭제된다는 것이 목표입니다.

나는 그것을 마스크하려고했으나 (아래 참조), 스크립트의 다음 단계에서 완벽하게 작동하지 않는다.

notUsed = np.ma.masked_where(notUsed == 0, notUsed) 

다음 단계는 다음 가장 가까운 점을 찾는 루프입니다. 먼저 단어에서 내가 무엇을하려고하는지 설명하려고 시도하고 (나중에 작동하지 않는 ...) 내 코드를 첨부 할 것입니다.

초기 지점 1부터 시작하여 벡터 길이를 사용하여 다음 가장 가까운 지점을 찾아야합니다. 나는 나머지 모든 점들을 시도 할 것이다. 어떤 점이 나머지 점인지 알기 위해 필자는 함수에 "notUsed"라는 인수를주었습니다. 포인터는 사용되지 않으면 "1"을 사용하고 0이 사용되면 0으로 배열을 기억합니다 (0은 "false"를 의미합니다. "그러나 우리는 아직 어떻게 발견되지 않았다). 은 내가 무슨 짓을하는 것은 최소 값이 발견되면 값 = 0 마스크해야

, 인덱스 위치가 기록 된 것을 요청 후, 우리는 그냥 0으로 사용되는 값을 설정 xEdgewhile로 xEdge의 탄소 복사본을 만들 수 있습니다 . 이것을 사용하여 xEdgeOrderedn에서이 새로운 점을 채우고이 새로운 점에서 시작하는 루프를 계속할 수 있습니다. 그러나 그 전에는 방금 사용한 색인을 삭제하여 더 이상 액세스 할 수 없도록해야합니다. 우리가 matlab에 있다면, 우리는 notUsed (index) = false; - 질문은 파이썬에서 어떻게 할 수 있는가? 도움이된다면

i, z, min = 1, 0, 'inf' 
xEdgewhile = xEdge + []; yEdgewhile = yEdge + []; 
while i < len(xEdge): 
     i = i + 1 
     notUsedIndices = indexVector #This line might be useless 
     while z < len(xEdge): 
     distance = math.sqrt((xEdgewhile[z] - xEdgeOrdered[(i-1)])**2 + (yEdgewhile[z] - yEdgeOrdered[(i - 1)])**2) 
     if distance < min: 
      min, distance_min, = distance, z 
     z = z + 1 
     print min 
     xEdgeOrdered[i] = xEdge[distance_min] 
     yEdgeOrdered[i] = yEdge[distance_min] 
     xEdgewhile[distance_max], yEdgewhile[distance_min] = 0, 0 
     xEdgewhile = np.ma.masked_where(xEdgewhile == 0, xEdgewhile) 
     yEdgewhile = np.ma.masked_where(yEdgewhile == 0, yEdgewhile) 

이 참고로, 나는 또한 당신에게 MATLAB 코드를 제공 할 수 있습니다

이것은 내가 생각 해낸 코드입니다. 긴 이야기하자면, 논리 0 또는 다른 방법을 사용하여 배열의 정확한 점을 삭제하려고합니다.

+0

NaN 또는 inf에 사용하지 않으려는 값을 설정하지 않는 이유는 무엇입니까? – Trogdor

답변

1

정확하게 컨텍스트를 이해할 수는 없지만 "긴 이야기 짧게"와 관련하여 배열의 특정 지점을 삭제하는 방법은 몇 가지 있습니다. 특정 값에 해당하는 요소를 삭제하려면 논리를 사용하여 해당 값을 가진 요소를 제외한 모든 배열 요소를 선택합니다.val가 배열에 한 번만 발생하는 경우 예를 들어, 이것은 단지 당신이 보이는 방식으로 작동합니다

import numpy as np 
a = np.array([1, 2, 3, 4, 5]) 
val = 3 
# If you want to delete the value 
b = a[a != val] 
# If you want the value to become something else (eg. 0) 
a[a == val] = 0 

참고 작동 할 수 있습니다. 당신은 당신이 제거 할 요소의 인덱스가있는 경우, 참조 here

numpy.delete(a, index) 

numpy.delete()를 사용하거나, 당신이 그것을 삭제하지 않으려면,하지만 단지 (예를 들어 다른 값으로 바꿀 싶어요. 모든에서 원래 배열에 엉망 원하지만 단지 고려에서 특정 요소를 먹고 싶어하지 않을 경우 0),

a[index] = 0 

편집 다시 그런

, 당신은 산업사를 사용할 수 있습니다 ex 배열 및 그에 따라 요소를 삭제하십시오. 예를 들어,이 방법을 사용하여 인덱스가 말이며,이 순서에서

b = np.arange(len(a)) 
# Begin algorithm on a[b] 
# Once an element is found in a and should no longer be considered... 
b = np.delete(b, index) 
# Repeat 

주 출력, 2

>>> b = np.arange(len(a)) 
>>> a[b] 
array([1, 2, 3, 4, 5]) 
>>> b = np.delete(b, 2) 
>>> a[b] 
array([1, 2, 4, 5]) 

, 당신은 당신의 배열이 고정두고 있지만, 동적으로 고려하여 설정을 수정할 수 있습니다.

0

답장을 보내 주시겠습니까?

Numpy 배열의 크기가 고정되어 있으므로 항목을 삭제할 수 없다는 문제가있었습니다. 해결책은 함수에서 도달 할 수없는 값으로 값을 대체하거나 배열 대신 목록을 사용하는 것입니다.

+0

설명해 주셔서 감사합니다. 몇 가지 간단한 메모. 답변에 응답하려는 경우 선호하는 방법은 응답을 원래 답변에 대한 설명으로 추가하는 것이지 별도 응답으로 제공하는 것이 아닙니다. 또한, 당신이 대답을 기쁘게 생각합니다. 일반적으로, 귀하가 SO에 대해 도움이되거나 도움이된다면 그 답변을 "선결"하는 것이 좋습니다. 실제로 귀하의 질문에 대답한다면, 그 대답에 대해서도 "동의"를 클릭하는 것이 좋습니다. 마지막으로, 귀하의 의견을 바탕으로 내 대답을 편집했습니다. – philE