4.7.2 넘파이 종합 연습문제

앞서 배운 배열 생성, 인덱싱, 불리언(Boolean) 필터링, 그리고 유니버설 내장 함수들의 개념을 바탕으로 스스로 문제를 해결해 보세요. 정답 코드를 보기 전에 먼저 코드를 짜보는 것을 추천합니다.

[실전 연습문제]

문제 1. 주어진 1차원 벡터의 각 요소에 5를 일괄적으로 더한 새로운 덧셈 배열을 생성하시오.

import numpy as np
a = np.array([1, 2, 3, 4, 5])

문제 2. 주어진 행렬 B가 주어졌을 때, 2번째, 4번째, 5번째 행(Row)만을 선택하여 분리해내시오. (파이썬 인덱싱에 주의하세요)

B = np.array([
    [ 8, 10,  7,  8],
    [ 2,  4,  5,  5],
    [ 7,  6,  1,  7],
    [ 2,  6,  8,  6],
    [ 9,  3,  4,  2]
])

문제 3. 위 행렬 B 구조에서, 위에서 3번째 위치한 열(Column, 인덱스 번호 2)의 숫자가 3보다 큰 데이터 행들만 발췌하시오.

문제 4. 행렬 B의 각 행별 숫자의 합계(Sum)가 전체 20보다 크거나 같은 우수한 행 집단만 선택하여 새로운 행렬을 만드시오.

문제 5. 행렬 B에서 각 열별 수학 평균점수(Mean)가 5 이상인 열(Column)이 전체 행렬의 몇 번째 위치(인덱스 번호)에 랭크되어 있는지 np.where() 함수를 사용하여 콕 집어 찾아내시오.

문제 6 (시각화 기초). 수학 점수가 [80, 90, 70, 60, 100]인 5명의 학생이 있습니다. 이 데이터를 막대그래프(Bar Plot)로 그리고, 제목을 “Math Scores”로 설정하세요.

문제 7 (Numpy 배열 생성). 0부터 20까지의 숫자 중에서 짝수만 들어있는 Numpy 배열을 생성하세요.

문제 8 (배열 변환 Reshape). 0부터 11까지의 숫자가 들어있는 배열을 만들고, 이를 3행 4열의 2차원 행렬로 변환하세요.

문제 9 (브로드캐스팅). 다음 행렬의 모든 원소에 10을 한 번에 더하세요.

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

문제 10 (불리언 인덱싱 필터링). 다음 점수 배열에서 80점 이상인 점수만 골라내어 출력하세요.

scores = np.array([55, 88, 92, 70, 65, 82])

[정답 및 해설]

문제 1 정답 넘파이의 강력한 장점 중 하나인 스칼라 브로드캐스팅(Broadcasting)입니다. 굳이 for 반복문을 쓰지 않고도 즉석에서 더할 수 있습니다.

print(a + 5)
# 4.7.2 [ 6  7  8  9 10]

문제 2 정답 행(Row)에 대한 다차원 인덱싱 기법입니다. 파이썬은 무조건 0부터 시작하므로 두 번째 줄은 인덱스 1, 네 번째는 인덱스 3에 해당합니다. 열(Column)은 콤마 뒤에 :를 사용하여 전체 허용을 의미합니다.

B_selected = B[[1, 3, 4], :]
print("선택된 분리 행렬:\n", B_selected)

문제 3 정답 불리언(논리) 배열 색인을 활용하는 매우 중요한 실무 스킬입니다. 전체 모든 행:의 2번 인덱스 열에 접근하는 방법은 [:, 2] 입니다.

B_filtered = B[B[:, 2] > 3, :]
print("특정 조건의 행들:\n", B_filtered)

문제 4 정답 행 내부에 있는 서로 다른 열들의 값을 가로로 더해야 하므로 행을 압축해 버리는 axis=1 축 속성을 지정해야 합니다.

# 4.7.2 각 행별 요소 합계 구하기
row_sums = np.sum(B, axis=1)

# 4.7.2 구해진 합계를 조건으로 넘겨 전체 행렬 B 슬라이싱
B_row_sums_filtered = B[row_sums >= 20, :]
print("합계 통과 집단:\n", B_row_sums_filtered)

문제 5 정답 이번엔 반대로 세로로 아래로 내려가며 모든 항목의 평균을 내야 하므로 컬럼을 압축하는 axis=0을 지정해야 합니다. 그리고 위치를 파악하기 위해 where을 사용합니다.

col_means = np.mean(B, axis=0)
col_indices = np.where(col_means >= 5)[0]

print("평균이 선방한 열의 인덱스 좌표 번호:", col_indices)

문제 6 정답

import matplotlib.pyplot as plt

scores = [80, 90, 70, 60, 100]
students = ['A', 'B', 'C', 'D', 'E'] # X축 라벨용

plt.bar(students, scores)
plt.title("Math Scores")
plt.show()

문제 7 정답

# 4.7.2 부터 21 전까지(20까지), 2씩 건너뛰기
evens = np.arange(0, 21, 2)
print(evens)
# 4.7.2 출력: [ 0  2  4  6  8 10 12 14 16 18 20]

문제 8 정답

arr = np.arange(12)
matrix = arr.reshape(3, 4)
print(matrix)

문제 9 정답

matrix = np.array([[1, 2], [3, 4]])
result = matrix + 10
print(result)
# 4.7.2 [[11 12]
# 4.7.2 [13 14]]

문제 10 정답

scores = np.array([55, 88, 92, 70, 65, 82])

# 4.7.2 마스크 생성 (80점 이상)
mask = scores >= 80

# 4.7.2 필터링
high_scores = scores[mask]
print(high_scores)
# 4.7.2 출력: [88 92 82]
서브목차