본문 바로가기
Pythonian

파이썬에서 일정 간격 이내 지점 삭제하기

by noruen 2022. 1. 20.

문제 

배열 'arr' (numpy.ndarray) 에서 근접한 값의 간격이 5 보다 작은 경우를 삭제하려고 한다. 

 

파이썬 코드 1 

import numpy as np

arr = np.array([  1,   8,   9,  10,  12,  24,  26,  35,  39,  43,  49,  59,  60,
        69,  77,  80,  86,  90, 101, 112, 118, 119, 126, 133, 145, 146,
       161, 172, 177, 181, 191, 193, 200, 206, 207, 210, 211, 212, 215,
       219, 225, 232, 234, 239, 244, 250])

idxD = np.where(np.diff(arr) < 5)[0]

arrRevised = np.delete(arr, idxD)

 

결과

 

arr
array([  1,   8,   9,  10,  12,  24,  26,  35,  39,  43,  49,  59,  60,
        69,  77,  80,  86,  90, 101, 112, 118, 119, 126, 133, 145, 146,
       161, 172, 177, 181, 191, 193, 200, 206, 207, 210, 211, 212, 215,
       219, 225, 232, 234, 239, 244, 250], dtype=int32)

 

idxD
array([ 1,  2,  3,  5,  7,  8, 11, 14, 16, 20, 24, 28, 30, 33, 34, 35, 36,
       37, 38, 41], dtype=int32)

 

arrRevised
array([  1,  12,  26,  43,  49,  60,  69,  80,  90, 101, 112, 119, 126,
       133, 146, 161, 172, 181, 193, 200, 219, 225, 234, 239, 244, 250],
      dtype=int32)

 

 

파이썬 코드 2

import numpy as np

arr = np.array([  1,   8,   9,  10,  12,  24,  26,  35,  39,  43,  49,  59,  60,
        69,  77,  80,  86,  90, 101, 112, 118, 119, 126, 133, 145, 146,
       161, 172, 177, 181, 191, 193, 200, 206, 207, 210, 211, 212, 215,
       219, 225, 232, 234, 239, 244, 250])

for D in range(2, 6):
    idxD = np.where(np.diff(arr) < D)[0]
    print(f'D = {D}: idxD = {idxD}')
    arr = np.delete(arr, idxD)
    print(f'arr = {arr}')
    
arrRevised = arr

결과:

 

arr
array([  1,   8,   9,  10,  12,  24,  26,  35,  39,  43,  49,  59,  60,
        69,  77,  80,  86,  90, 101, 112, 118, 119, 126, 133, 145, 146,
       161, 172, 177, 181, 191, 193, 200, 206, 207, 210, 211, 212, 215,
       219, 225, 232, 234, 239, 244, 250], dtype=int32)

 

D = 2: idxD = [ 1  2 11 20 24 33 35 36]
arr = [  1  10  12  24  26  35  39  43  49  60  69  77  80  86  90 101 112 119
 126 133 146 161 172 177 181 191 193 200 207 212 215 219 225 232 234 239
 244 250]
D = 3: idxD = [ 1  3 25 33]
arr = [  1  12  26  35  39  43  49  60  69  77  80  86  90 101 112 119 126 133
 146 161 172 177 181 193 200 207 212 215 219 225 234 239 244 250]
D = 4: idxD = [ 9 26]
arr = [  1  12  26  35  39  43  49  60  69  80  86  90 101 112 119 126 133 146
 161 172 177 181 193 200 207 215 219 225 234 239 244 250]
D = 5: idxD = [ 3  4 10 20 25]
arr = [  1  12  26  43  49  60  69  80  90 101 112 119 126 133 146 161 172 181
 193 200 207 219 225 234 239 244 250]

 

arrRevised
array([  1,  12,  26,  43,  49,  60,  69,  80,  90, 101, 112, 119, 126,
       133, 146, 161, 172, 181, 193, 200, 207, 219, 225, 234, 239, 244,
       250], dtype=int32)

반응형

댓글