2차원 파이선 내부의 1차원 행렬 조작


다름이 아니라 파이선으로 클러스터링 하는 코드를 짜고 있습니다.
일단 초기 데이터가

a=[1,2,13,14,16,25,54,68,88,94,101,110,114,122,132,165,170]

이렇게 보여진다고 가정하고 군집화 코드를 작성하였습니다.

군집화 코드는 데이터 행렬과 최대 거리를 파라미터로 받아,
먼약 최대 거리 허용가능한 최대거리가 10이라 가정하면,
두 원소사이 거리가 10 이하일경우, 같은 array에 속하게 코딩을 했습니다.

위 예시의 결과는 다음과 같은 2차원 array로 표시됩니다.

[[1,2],[13,14,16,25],[54],[68],[88,94,101,110,114,122,132],[165,170]]

여기서 제가 하고자 하는것은
[54], [68]와 같은 길이가 1인 내부의 데이터를 제거하여
다음과 같은 결과를 얻고자 합니다

[[1,2],[13,14,16,25],[88,94,101,110,114,122,132],[165,170]]

이렇게 할려면 대충 a.pop을 써야겠다는 생각은 드는데..;
원하는 결과는 나오질 않습니다.

th = 10
g=[[a[0]]]
for i in a[1:] :
    if abs(i - g[-1][-1]) <= th:
        g[-1].append(i)
    else:
        g.append([i])
  • 2016년 09월 10일에 작성됨

조회수 109


1 답변


좋아요
1
싫어요
채택취소하기

원소 길이가 1개 이상인 리스트만 모아두는 새로운 리스트를 만드세요.

clustered = [[1,2],[13,14,16,25],[54],[68],[88,94,101,110,114,122,132],[165,170]]
removed = []
for ls in clustered:
  if len(ls) > 1:
    removed.append(ls)

# removed = [[1, 2], [13, 14, 16, 25], [88, 94, 101, 110, 114, 122, 132], [165, 170]]

clustered = [[1,2],[13,14,16,25],[54],[68],[88,94,101,110,114,122,132],[165,170]]
removed = [ls for ls in clustered if len(ls) > 1]

# removed = [[1, 2], [13, 14, 16, 25], [88, 94, 101, 110, 114, 122, 132], [165, 170]]
  • 2016년 09월 11일에 수정됨
    프로그래밍 언어를 좋아하는 프로그래머
  • 2016년 09월 10일에 작성됨
    프로그래밍 언어를 좋아하는 프로그래머

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close