abt Python/심화

Numpy 배열 연산, 인덱싱, 슬라이싱

cloudin 2023. 8. 14. 10:45

Numpy 배열 연산

  • 단순 연산 기호
기호 & 메서드 내용 기호 & 메서드 내용
+ 더하기 - 빼기
* 곱셈 ** 거듭제곱
/ 나누기 >,<,>=,<= 비교연산자
sum() mean() 평균
std() 표준편차 var() 분산
min() 최솟값 max() 최대값
cumsum() 누적합 cumprod() 누적

 

  • 선형대수를 위한 행렬 연산
사용 예 내용
A.dot(b)
np.dot(A,B)
행렬곱(matrix product)
A.transpose()
np.transpose(A)
전치행렬(transpose matrix)
np.linalg.inv(A) 역행렬(inverse matrix)
np.linalg.det(A) 행렬식(determinant)

 

인덱싱 : 배열의 위치나 조건을 지정해 배열의 원소를 선택

  • 생성한 배열에서 원하는 값을 인덱스를 활용하여 선택 실습
index1 = np.array([0, 10, 20, 30, 40, 50])
index1
# array([ 0, 10, 20, 30, 40, 50])

index1[0]   # index1의 첫 번째 값
# 0

index1[4]   # index1의 인덱스 4에 위치한 값
# 40

index1[[0,2,4]]   # 원하는 벡터의 값을 선택하여 뽑을 때
# array([ 0, 20, 40])

# 10부터 100 미만까지의 값들 중 10씩 증가하는 값들 선택하여 3x3 행렬
index2 = np.arange(10, 100, 10).reshape(3,3)
index2
# array([[10, 20, 30],
#        [40, 50, 60],
#        [70, 80, 90]])

# 원하는 위치의 값 (0행 2열)
index2[0,2]
# 30

 

  • 배열에서 원하는 값을 인덱스를 활용하여 값 변경 실습
index1[5] = 100   # 5번째 값을 100으로 바꾸고 싶다
index1
# array([  0,  10,  20,  30,  40, 100])

index2[2,2]=99
index2           # index2의 2행 2열 값을 99로 변경
# array([[10, 20, 30],
#        [40, 50, 60],
#        [70, 80, 99]])

# 행을 통째로 바꾸고 싶을 때
index2[1]=[44,57,66]    # 1행을 바꿔줌
index2
# array([[10, 20, 30],
#        [44, 57, 66],
#        [70, 80, 99]])

 

  • 행렬에서 인덱스 의미

배열명[[첫번째데이터행, 두번째데이터행, 세번째데이터행 ..], [첫번째데이터열, 두번째데이터열, 세번째데이터열..]]

index2[[0,2], [0,1]]
# array([10, 80])

index2[[0,2,2], [0,1,2]]
# array([10, 80, 99])

 

  • 조건 인덱싱
index = np.array([1,2,3,4,5,6])
index[index > 3]       # index 값 중 3 초과 값만 추출
# array([4, 5, 6])

index[(index % 2) == 0]     # index 값 중 짝수 값만 추출
# array([2, 4, 6])

 

 

슬라이싱 : 범위를 지정해 배열의 일부분을 선택하는 방법

  • 생성한 배열에서 슬라이싱을 이용하여 배열 일부분 선택
# 슬라이싱을 활용하여 연속된 값 추출
slice1 = np.array([0,10,20,30,40,50])

slice1[1:5]     # 10~40 추출
# array([10, 20, 30, 40])

slice1[:3]      # 처음부터 3미만 인덱스에 해당하는 값 추출
# array([ 0, 10, 20])

slice1[2:]      # 인덱스2부터 끝까지
array([20, 30, 40, 50])

 

  • 슬라이싱을 이용하여 배열의 값을 바꾸고 싶을 때
slice1[2:5] = np.array([25,35,45])   # slice1의 2,3,4인덱스에 해당하는 값을 25, 35, 45로 바꿈
slice1
# array([ 0, 10, 25, 35, 45, 50])

slice1[3:6] = 60     # 해당하는 인덱스의 값들을 하나의 값으로 바꾸기
slice1
# array([ 0, 10, 25, 60, 60, 60])

 

  • 행렬 슬라이싱
# 행렬
slice2 = np.arange(10, 100, 10).reshape(3,3)
slice2
# array([[10, 20, 30],
#        [40, 50, 60],
#        [70, 80, 90]])

# 원하는 값 뽑아내기
slice2[1:3, 1:3]     # [행, 열]
# array([[50, 60],
#        [80, 90]])

slice2[:3, 1:]
# array([[20, 30],
#        [50, 60],
#        [80, 90]])

# 값을 변경
slice2[0:2, 1:3] = np.array([[25,35], [55,65]])
slice2
# array([[10, 25, 35],
#        [40, 55, 65],
#        [70, 80, 90]])