PYTHON LIBRARY/NumPy Library

Python NumPy 슬라이싱과 인덱싱 : 효율적인 데이터 접근 방법 ndarray[], copy() 활용

신강희 2024. 4. 8. 00:12
728x90

< Slicing - 잘라서 가져오기 >

1. ndarray[start:end]

2. ndarray[start:]

3. ndarray[:end]

 

# 뭐 부터 뭐 까지 => 3시 ~ 5시
#                    3 : 5+1

# 홍길동이라는 이름을 예시로 원하는 인덱스 위치에 결과만 출력

fullname = '홍길동'

fullname[1:2+1]

'길동'

 

# 어디서부터 시작해서 끝까지

fullname[1:]

'길동'

 

# 1차원 배열 생성

x = np.arange(2, 10+1)

x

x[2 : 5+1] => 2번 인덱스 위치부터 5번 위치까지 가져오기

array([4, 5, 6, 7])

 

# X 라는 다차원 배열에서 원하는 위치값 가져오기

array([[76, 95, 49, 98, 11],
       [19, 19, 29, 64, 80],
       [81, 28, 80, 27, 42],
       [54, 85,  4, 83, 10]])

 

# 다차원 배열일 경우 : (콜론) 을 기준으로 좌측이 행 우측이 열의 위치

# 즉, 1번 행의 1번 인덱스 위치부터 3번 위치까지 가져오기

X[1, 1 : 3+1]

array([19, 29, 64])

 

X[ [0,2] ,  ]  => 두개 이상의 결과값을 따로 불러올때는 리스트에 담아서 []

array([[76, 95, 49, 98, 11],
       [81, 28, 80, 27, 42]])

 

# 열만 처리하고 싶을때는 행 자리에 전체를 처리하겠다는 의미로 : (콜론) 을 사용한다. 외워야함!!!

X[  :  ,  [1,3,4]  ]

array([[95, 98, 11],
       [19, 64, 80],
       [28, 27, 42],
       [85, 83, 10]])

 

# 특정 위치의 데이터값을 변경하고 싶을때 !

X = np.random.randint(1, 100, (3,4) )

X

array([[99, 87, 52, 61],
       [74, 76, 88,  9],
       [12, 86, 89, 46]])

 

X[ 1,0 ] = 100 => 2행 1열의 값을 슬라이싱해 가져와서 100으로 바꾼다

X

array([[ 99,  87,  52,  61],
       [100,  76,  88,   9],
       [ 12,  86,  89,  46]])

 

< Slicing 할때, 주의할 점!!! >

# 상단의 X 변수를 그대로 가져와 실행

# 1열을 제외한 나머지 전체 열만 따로 변수로 저장한다

Y = X[ : , 1:]

Y

array([[87, 52, 61],
       [76, 88,  9],
       [86, 89, 46]])

 

# 때어온 Y 변수 안에 데이터값을 변경

Y[ 2,2 ] = 100

Y

array([[ 87,  52,  61],
       [ 76,  88,   9],
       [ 86,  89, 100]])

 

# 이후 X를 호출하면

X

array([[ 99,  87,  52,  61],
       [100,  76,  88,   9],
       [ 12,  86,  89, 100]])

 

*** X에서 Y를 때어와서 Y에서 데이터를 바꾸면 원본값인 X도 값이 변경되어 버림 추후 오류가 출력될수 있음

< Copy >

그러모르 copy 문구를 사용하여 원본데이터의 영향을 주지 않도록 일정 데이터를 복사해서 변경한다.

 

X

array([[ 99,  87,  52,  61],
       [100,  76,  88,   9],
       [ 12,  86,  89, 100]])

 

Y = X[ : , 1 : ].copy()

Y

rray([[ 87,  52,  61],
       [ 76,  88,   9],
       [ 86,  89, 100]])

 

Y[2,2] = 0

Y

array([[87, 52, 61],
       [76, 88,  9],
       [86, 89,  0]])

 

X

array([[ 99,  87,  52,  61],
       [100,  76,  88,   9],
       [ 12,  86,  89, 100]])

 

*** 이번에는 X 데이터값이 변경되지 않은것을 확인할수 있다

< 원하는 행, 열을 슬라이싱해서 가져오는 방법 >

X

array([[ 99,  87,  52,  61],
       [100,  76,  88,   9],
       [ 12,  86,  89, 100]])

 

# 해당 행렬에서 1행에 1,2,3열 3행에 1,2,3열만 가져오려면???

# 데이터 억세스 하는것 계속 연습할것..! 1차 배열 2차 배열 원하는 값만 가져오고 특정 값만 바꾸는것 계속 연습!! 인덱싱 하여 원하는 값 가져오는것도 연습!!!

 

#   0,2 번 인덱스 행의 0,1,2 인덱스 열까지만 가져오기

X[ [0,2] , : 3 ]

array([[99, 87, 52],
       [12, 86, 89]])

< 중복된것 제거한 값만 리스트로 가져오기 >

# 랜던함 일차원 (중복값이 출력되도록) 배열 생성

x = np.random.randint(1, 10, 20)

x

array([5, 4, 3, 6, 4, 9, 1, 4, 3, 1, 1, 7, 8, 7, 4, 4, 3, 8, 1, 6])

 

 

# 중복된 값을 제거하고 유니크한 값만 출력 np.unique

np.unique(x)

array([1, 3, 4, 5, 6, 7, 8, 9])

 

# 중복이 제거된 데이터값의 크기를 확인하고 싶을땐

np.unique(x).size

8

 

다음 게시글에서 계속

 

반응형