본문 바로가기
Python/데이터 분석

[Numpy] Numpy 배열의 Indexing & Slicing

by snow_white 2022. 4. 2.

Indexing

  • 파이썬의 시퀀스 자료형에서 사용한 것과 동일하게 대괄호[ ] 를 사용하여 특정 요소에 접근
  • Numpy에서는 대괄호 한 번만 사용

ex) 2차원 리스트에서 데이터 접근 : list[0][1]

ex) 2차원 Numpy Array에서 데이터 접근 : array[0, 1] ⇒ [ 행, 열 ]

 

◾ 정수 인덱싱

arr1 = np.array([1,2,3,4,5])
arr1

arr1[2] # 3
arr1[-1] # 5

#arr1[6] # Error!

arr1[:2] # array([1, 2])
arr1[-4:-1] # array([2, 3, 4])
arr1[::-1] # array([5, 4, 3, 2, 1])
array = np.arange(9).reshape(3,3)
'''
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
'''
array[0] # array([0, 1, 2])
array[0,0] # 0
array[-1,-1] # 8
array[-1] # array([6, 7, 8])
array[-2] # array([3, 4, 5])

 

◾조건 인덱싱

np.random.seed(0) # 동일한 난수 세트가 나타나도록 설정

arr1 = np.random.randn(4,4) # 가우시안 정규분포 randn , 가운데가 볼록한
arr1
'''
array([[ 1.76405235,  0.40015721,  0.97873798,  2.2408932 ],
       [ 1.86755799, -0.97727788,  0.95008842, -0.15135721],
       [-0.10321885,  0.4105985 ,  0.14404357,  1.45427351],
       [ 0.76103773,  0.12167502,  0.44386323,  0.33367433]])
'''

⭐ 논리 연산자를 사용해서 값 받아오기

# 1. 논리 연산자를 사용해서 값을 받아옴 *시험*
arr1<0
'''
0보다 작은 부분만 True 반환
array([[False, False, False, False],
       [False,  True, False,  True],
       [ True, False, False, False],
       [False, False, False, False]])
'''
arr1[arr1<0] # True에 해당하는 값만 추출 array([-0.97727788, -0.15135721, -0.10321885])

 

대입해주어야 원본이 바뀐다.  

arr1[arr1<0] = 0 # True에 해당하는 값이 0으로 overwrite => 원본이 바뀜!
arr1
'''
array([[1.76405235, 0.40015721, 0.97873798, 2.2408932 ],
       [1.86755799, 0.        , 0.95008842, 0.        ],
       [0.        , 0.4105985 , 0.14404357, 1.45427351],
       [0.76103773, 0.12167502, 0.44386323, 0.33367433]])
'''

 

▫️  다른 Array를 이용하여 인덱싱 하는 방법

  • 조건 인덱싱도 Boolean Array를 이용하여 인덱싱 하는 팬시 인덱싱의 일종
  • 선택하고자 하는 위치를 Array로 묶어서 데이터에 접근 가능
row = [0,1]
col = [2,1]
array[row, col] # array([2, 4])

array[[0,1], [2,1]] # array([2, 4])

array[0,2] # 2
array[1,1] # 4

Slicing

◾ 정수 슬라이싱

arr1 = np.arange(16).reshape(4,4)

arr1
'''
arr1[0 , : ]
arr1[ :, 1]
arr1[ :2, 1: ]
arr1[-1: , 1:3]
'''
arr1[0 , : ] # array([0, 1, 2, 3])
arr1[ :, 1] # array([ 1,  5,  9, 13])
arr1[ :2, 1: ]
'''
array([[1, 2, 3],
       [5, 6, 7]])
'''
arr1[-1: , 1:3] # array([[13, 14]])

◾ 정수 슬라이싱 시 고려사항

  • Numpy는 다차원 배열(ndarray)를 염두하고 설계했기 때문에 데이터의 복사를 남발하지 않음
  • 원본 배열을 슬라이싱 하여 새로운 배열을 만든 경우, 새로운 배열은 값이 복사되지 않고 참조됨
    • 새로운 배열을 수정하면 원본 배열도 수정됨
  • 만약 값 복사하여 저장하고 싶은 경우 copy() 함수를 이용
  • 또는 팬시 인덱싱 이용

원본 훼손!

a = np.arange(9).reshape(3,3)
a
'''
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
'''
b = a[:, 1]
b # array([1, 4, 7])

b[0] = 10
a
'''
array([[ 0, 10,  2],
       [ 3,  4,  5],
       [ 6,  7,  8]])
'''

copy() : 원본 유지 복사

a = np.arange(9).reshape(3,3)
a
'''
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
'''

b = a[:, 1].copy()
b # array([1, 4, 7])

b[0] = 1
a
'''
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
'''

2차원 인덱싱과 reshape reshape는 변환 전과 후의 행과 열 곱한 수가 동일해야 한다

arr2 = np.arange(32).reshape(4,8)
print(arr2)
'''
[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]
 [16 17 18 19 20 21 22 23]
 [24 25 26 27 28 29 30 31]]
'''

array = np.arange(9).reshape(3,3)
array[0] # array([0, 1, 2])
array[0,0] # 0
array[-1,-1] # 8
array[-1] # array([6, 7, 8])
array[-2] # array([3, 4, 5])

2차원 배열 슬라이싱과 reshape

arr2[:, 1:3]
'''
array([[ 1,  2],
       [ 9, 10],
       [17, 18],
       [25, 26]])
'''
#  마지막 행에서의 (두번째부터 세번째 열) 추출
arr2[-1, 1:3] # [25, 26]

 

◾ np.where(조건[ , x , y])

  • 조건을 만족하는 요소의 위치를 반환
  • x와 y를 지정하는 경우 값이 대체된 배열을 반환
    • x : 요소의 조건이 True인 경우 지정할 값
    • y : 요소의 조건이 False인 경우 지정할 값

조건 masking 연산

논리 연산자를 사용해서 값을 받아오는 경우 True 혹은 False를 반환하고

array에 적용하면 True에 해당하는 값만 추출하기 때문에 masking 연산이 됨

# 1. 논리 연산자를 사용해서 값을 받아옴 *시험*
arr1<0
'''
0보다 작은 부분만 True 반환
array([[False, False, False, False],
       [False,  True, False,  True],
       [ True, False, False, False],
       [False, False, False, False]])
'''
arr1[arr1<0] # True에 해당하는 값만 추출 array([-0.97727788, -0.15135721, -0.10321885])

음수 값을 리턴 시키는 코드

arr1[arr1<0] ⇒ 0보다 작은 값은 Ture, 이 True에 해당하는 값 받아옴

arr1<0 아님아님! Boolean 표현식으로 나옴

arr1[arr1<0] = 0 하면 True에 해당하는 값이 0으로 바뀌고, 원본도 바뀜!

arr1[arr1<0] = 0 # True에 해당하는 값이 0으로 overwrite => 원본이 바뀜!
arr1
'''
array([[1.76405235, 0.40015721, 0.97873798, 2.2408932 ],
       [1.86755799, 0.        , 0.95008842, 0.        ],
       [0.        , 0.4105985 , 0.14404357, 1.45427351],
       [0.76103773, 0.12167502, 0.44386323, 0.33367433]])
'''

arr2의 요소 중 1000 미만인 요소는 -1으로, 1000 이상인 요소는 arr2의 값을 유지하여 arr3에 저장하기

arr3 = np.array(arr2)

arr3[arr3<1000] = -1
arr3

 

'Python > 데이터 분석' 카테고리의 다른 글

[Numpy] Numpy 배열의 통계함수  (0) 2022.04.02
[Numpy] Numpy 배열의 정렬  (0) 2022.04.02
[Numpy] Numpy 배열의 연산  (0) 2022.04.02
[Numpy] Numpy 배열의 속성 및 함수  (0) 2022.04.02
[Numpy] Numpy  (0) 2022.04.02

댓글