상세 컨텐츠

본문 제목

파이썬 입력에서 x_data, y_data 분리하기(w/ 슬라이싱)

PYTHON

by 이를루 2022. 3. 30. 13:11

본문

파이썬 입력에서 x_data, y_data 분리하기(w/ 슬라이싱)
아래 예제는 리스트를 이용한 예제임

예제

xy = np.array([[821.659973, 833.450012, 908100, 828.349976, 831.659973],
               [813.02002, 828.070007, 1828100, 821.655029, 828.070007],
               [809.929993, 824.400024, 1438100, 818.97998, 824.159973],
               [816, 820.958984, 1008100, 815.48999, 819.23999],
               [819.359985, 823, 1188100, 818.469971, 818.97998],
               [819, 823, 1198100, 816, 820.450012],
               [811.700012, 815.25, 1098100, 809.780029, 813.669983],
               [809.51001, 816.659973, 1398100, 804.539978, 809.559998]])

x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]

x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]

이 뜻은?

  •  x_data = xy[ : , 0:-1]
     " : "  ==>  row방향으로  ":", 즉 전체를 의미
     " 0:-1" ==> col 방향으로 index 0~ 마지막의 하나앞( -1이 마지막임으로 0:-1은 마지막 값빼고 모두를 의미하게 됨)
  • 마찬가지로 y_data = xy[:, [-1]] 
     ":" ==> row방향으로 모든 것
     "[-1]" ==> col 방향으로 마지막 하나!를 의미하게 됨. 

    주의.  만약 두번째 인자가 "[-1]"이 아닌 그냥  "-1"이면 결과가 1*n 리스트에 들어감.. 
    즉,  결과가 xy[: , [-1]] 과 xy[:, -1]은 내용물은 같지만 결과의 방향이 다르게 됨.
    xy[:, [-1]]은 row로 퍼진 결과를 가지게 되고,
    xy[:, -1]은 col로 퍼진 결과를 가지게 됨. 
      SyntaxEroor가 나오지 않아서, 나중에 매트릭스 연산 오류로 이어지는 실수로, 발견하기 어려운 실수!

  • 예)  [-1]과 -1의 차이!
y_data = xy[:, [-1]]
array([[831.659973],
       [828.070007],
       [824.159973],
       [819.23999 ],
       [818.97998 ],
       [820.450012],
       [813.669983],
       [809.559998]])
       
       
y_data  = xy[:, -1] 
array([831.659973, 828.070007, 824.159973, 819.23999 , 818.97998 ,
       820.450012, 813.669983, 809.559998])

 

해석방법 : 
y = xy [ *** , *** ] 는 리스트를 구성하는 것임.  
---  xy 데이터는 [ [ ], [ ] ]의 다중리스트로 매트릭스이며, 
---  내부 구성요소를 슬라이싱으로 지정하고 있음.
(1) 처음의 ":"는 xy의 [ [ ...], [ ...] ] 구조에서 바깥꺽쇠에 해당하는 것을 처리하게 됨 . ":"이니 모든 리스트를 처리하겠다라는 의미. 
(2) 두번째의 "0:-1", "[-1]", "-1"은한번 들어간 [...]의 내부에서 처리하게 됨.
       "0:-1"은 0번부터 마지막의 직전까지 (즉 마지막만 제외하고 모두 다) --> 이건 값들이니 1*n차원의 리스트(col 방향으로)
       "[-1]"은 마지막값을 뽑아서 다시 리스트로만들어줌. (따라서 row  방향이 됨)
       "-1"은 마지막 값을 뽑는데, 리스트가 아닌 그냥 값임.
       "-1:"은 편법으로 슬라이스 해서 값은 하나 뿐이지만, 리스트로 만들어줌 (따라서 row방향이 됨)
       "[0:-1]"은 리스트로 나온 것을 다시 리스트로 만들려 하기 때문에 SyntaxError가 됨.(갸우뚱~~~)

 

 

해석방법 :
정확하게는 첫요소부터 분석하는 것이 아니라 뒤요소 부터 분해해서 이해하면 쉬워짐.
뒤의 "0:-1"은 안쪽 [ .... ]의 0번~마지막직전까지를 의미하게 되고 다수요소임으로 리스트가 됨. 만약 "-1"이라고 하면 마지막 데이터 한요소 만을 의미하게 됨.
앞의 ":"는 바깥쪽 [ [...], [....] ]의 전체를 의미하게 됨으로 전체 행이 포함되게 됨.

주. 가끔 reverse order를 위하는 방법으로 array[::-1]을 주는데 초심자는 혼란 스럽게 보임. ( 콜론(쌍점) ":"가 2개인 연산자는 무엇인가????) 

 

잘못된 예)

y_data = xy[:, [-1:]]  # --> SyntaxError  두번째의 ":"에서
x_data = xy[:, [0:-1]] # --> SyntaxError  두번째의 ":"에서

해석방법 :
정확하게는 첫요소부터 분석하는 것이 아니라 뒤요소 부터 분해해서 이해하면 쉬워짐.
뒤의 "0:-1"은 안쪽 [ .... ]의 0번~마지막직전까지를 의미하게 되고 다수요소임으로 리스트가 됨. 만약 "-1"이라고 하면 마지막 데이터 한요소 만을 의미하게 됨.
앞의 ":"는 바깥쪽 [ [...], [....] ]의 전체를 의미하게 됨으로 전체 행이 포함되게 됨.


※ 가끔 reverse order 방법으로 array[::-1]을 주는데 초심자에게 혼란 스럽게 보임. ( 콜론(쌍점) ":"가 2개인 연산자는 무엇인가????) 

관련글 더보기