[Python] NumPy
programming/python

[Python] NumPy

24. NumPy

 

24.1 numpy

24.1.1 벡터 및 행렬 연산에 특화된 라이브러리

24.1.2 array 단위로 데이터를 관리함, 행렬(matrix)와 비슷함

24.1.3 pandas와 함께 데이터분석에 많이 사용됨

 

 

24.2 실습 예제

# NumPy 모듈을 import
import numpy as np
# 리스트
data1 = [1, 2, 3, 4, 5]

# 리스트를 NumPy 배열로 변환
arr1 = np.array(data1)

print(arr1)
print(type(arr1)) # 자료형
print(arr1.shape) # 배열의 차원(배열의 크기)

 

# 2차원 배열(리스트)
data2 = [
    [1, 2, 3],
    [4, 5, 6]
]

# 2차원 리스트를 NumPy의 2차원 행렬로 변환
arr2 = np.array(data2)
print(arr2)

#(2, 3): 2행 3열의 2차원 행렬
print(arr2.shape)

 

2차원 행렬 연산

# 2차원 행렬
arr1 = np.array([
    [1, 2, 3],
    [4, 5, 6]
])
arr2 = np.array([
    [7, 8, 9],
    [10, 11, 12]
])

# 같은 자리의 값을 더함
arr1 + arr2
arr1 - arr2
arr1 * arr2
arr1 / arr2
arr1 * 2

# 거듭제곱
arr1 ** 2

 

배열의 인덱싱

# 스트링 리스트를 NumPy 배열로 변환
names = np.array(\
    ["김철수", "이승호", "박철호", "김철수", "홍성민", "마이클", "존"])

# 7행 4열의 난수 발생, randn 정규분포 난수
data = np.random.randn(7, 4)

names
data

 

numpy.maximum

x = np.random.randn(8)
y = np.random.randn(8)

x
y

# 큰 값을 뽑아서 새로운 배열을 생성함
np.maximum(x, y)

 

합계, 평균, 그리고 정렬

# 5행 4열의 랜덤 값 생성
arr = np.random.randn(5, 4)
arr

arr.sum()   # 전체 합계
arr.mean()  # 전체 평균

arr.sum(axis = 0)   # 각 열의 합계
arr.sum(axis = 1)   # 각 행의 합계

np.sort(arr)                    # 오름차순 정렬
np.sort(arr, axis = 0)[::-1]    # 내림차순 정렬(열을 기준으로)

 

numpy.unique

names = np.array(\
    ["김철수", "이승호", "박철호", "김철수", "홍성민", "마이클", "존"])

ages = np.array([20, 25, 20, 23, 28, 29, 30, 31, 30, 40, 45])

# 중복 값을 제거한 결괏값 출력
print(np.unique(names))
print(len(np.unique(names)))

# 데이터베이스에서 DISTINCT와 같음
np.unique(ages)

 

 

24.3 데이터 분석 실습 - 영화 평점 데이터

[older datasets] - [MovieLens 1M Dataset] - [ml-1m.zip] 파일 다운로드

 

다운로드 후 D:\data\movielens 디렉터리에 압축 해제

 

영화 평점 데이터 로딩

##
# loadtxt(): 텍스트 파일 로딩
# delimiter: 필드 구분자
# dtype: 자료형
#
data = np.loadtxt("d:/data/movielens/ratings.dat", delimiter = "::", dtype = np.int64)

 

데이터의 첫 5행만 확인

# [행 start: end, 열 start: end]
data[: 5,: ]

 

데이터의 형태 확인

# (행, 열)
data.shape

 

전체 평균 평점 계산

# 행 범위 : 열 범위
# data[: , 2]: 전체 행, 2번 열
mean_rating_total = data[: , 2].mean()	# rating 컬럼
mean_rating_total

 

사용자 아이디 수집

# 전체 행, 0번 열
user_ids = np.unique(data[: , 0])
print(user_ids)
print(len(user_ids))

 

사용자별 평점 확인

# 사용자별 평균값을 저장할 배열
mean_values = []

for user_id in user_ids:
    # 첫 번째 열이 아이디
    # 예를 들어 현재 user_id가 1이라면 user_id가 1인 행들만 추출해서 data_for_user에 저장
    # data 중에서 모든 행, 0번 필드가 user_id인 행의 모든 컬럼
    data_for_user = data[data[: , 0] == user_id,: ]

    # 2번째 인덱스(평점)에 해당하는 값의 평균값
    value = data_for_user[: , 2].mean()

    # 사용자 아이디와 평균값을 배열에 추가
    # 리스트 안에 리스트가 들어가므로 2차원 리스트로 만들어짐
    mean_values.append([user_id, value])

 

사용자 아이디별 평점 확인

mean_values[: 5]

 

리스트를 NumPy 배열로 변환

mean_array = np.array(mean_values, dtype = np.float32)

# 0번 행부터 4번 행까지
mean_array[: 5]

mean_array.shape

 

계산 결과를 csv 파일로 저장

np.savetxt("d:/data/movielens/result.csv", \
    mean_array, fmt = "%.1f", delimiter = ",")

 

파일이 만들어졌는지 확인

 

 


[Python] 데이터 분석 라이브러리의 개요

[Python] Pandas

[Python] Matplotlib