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 |
댓글