[Python] Numpy 개인 정리
import numpy as np
# numpy의 배열 생성
list1 = [1,2,3,4,5]
list2 = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
arr1 = np.array(list1) # 1차원 배열
arr1
array([1, 2, 3, 4, 5])
arr2 = np.array(list2) # 2차원 배열
arr2
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
# 배열의 크기 확인
print(arr1.shape)
print(arr2.shape)
(5,)
(3, 4)
# size는 배열 내의 요소 개수
print(arr1.size)
print(arr2.size)
5
12
# 배열의 데이터 타입 확인
print(arr1.dtype)
print(arr2.dtype)
int64
int64
# 배열의 차원 확인
print(arr1.ndim)
print(arr2.ndim)
1
2
# 배열 초기화
arr_zero = np.zeros((3,3))
print(arr_zero)
print(arr_zero.dtype)
arr_one = np.ones((2,3))
print(arr_one)
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
float64
[[1. 1. 1.]
[1. 1. 1.]]
# 특정 값으로 배열 초기화
# np.full(차원, 데이터)
arr_full = np.full((4,3), 'z')
print(arr_full)
[['z' 'z' 'z']
['z' 'z' 'z']
['z' 'z' 'z']
['z' 'z' 'z']]
# 범위를 지정해서 배열 생성
# arange(시작점, 끝점+1, 데이터 폭)
arr = np.arange(1,51,5)
print(arr)
print(arr.shape)
print(arr.size)
[ 1 6 11 16 21 26 31 36 41 46]
(10,)
10
# 배열 생성 시 타입 지정
arr_type = np.array([1,2,2,5,3,4], dtype=np.str0)
print(arr_type)
# 타입 변경
arr_type = arr_type.astype('int64')
print(arr_type)
['1' '2' '2' '5' '3' '4']
[1 2 2 5 3 4]
# 랜덤 값으로 배열 생성
# np.random.rand(차원 수) : 랜덤 실수값
arr_random = np.random.rand(2,3)
print(arr_random)
[[0.069824 0.56538797 0.08239869]
[0.05746204 0.47192185 0.65286904]]
# np.random.randint(시작점, 끝점, size=(차원 수)) : 시작점부터 끝점-1 까지의 랜덤 정수 값
arr_random2 = np.random.randint(1,11, size=(3,3))
arr_random2
array([[ 3, 10, 5],
[ 1, 3, 8],
[ 9, 9, 8]])
# array 연산
array1 = np.array([1,2,3])
array2 = np.array([4,5,6])
print(array1+array2)
print(array1 / array2)
print(array1 // array2)
print(array1 % array2)
[5 7 9]
[0.25 0.4 0.5 ]
[0 0 0]
[1 2 3]
- BMI 지수 구하기
# txt파일 불러오기
data = np.loadtxt('/Users/min-yungi/Desktop/20210905pr/data/height_weight.txt', delimiter = ',')
print(data)
print(data.shape)
print(data[1,0])
[[175.2 180.3 175. 169.2 185.2 188. 177.6 178.2 177. 179. ]
[ 65.6 88. 79.2 69.3 55. 71.2 73. 68.9 74. 82. ]]
(2, 10)
65.6
height = data[0] * 0.01
print(height)
[1.752 1.803 1.75 1.692 1.852 1.88 1.776 1.782 1.77 1.79 ]
weight = data[1]
print(weight)
[65.6 88. 79.2 69.3 55. 71.2 73. 68.9 74. 82. ]
bmi = weight/(height**2)
print(bmi)
[21.37153104 27.07018468 25.86122449 24.20652885 16.03543423 20.14486193
23.14392095 21.69720651 23.62028791 25.59220998]
- Indexing & Slicing
array7 = np.arange(10)
print(array7)
print(array7[3:8])
array7[3:8] = 10
print(array7)
[0 1 2 3 4 5 6 7 8 9]
[3 4 5 6 7]
[ 0 1 2 10 10 10 10 10 8 9]
# 2차원 배열 생성
array8 = np.arange(50).reshape(5,10)
print(array8)
print(array8.shape)
# 2차원 배열 슬라이싱
print(array8[1:4,4:9])
[[ 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 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]]
(5, 10)
[[14 15 16 17 18]
[24 25 26 27 28]
[34 35 36 37 38]]
- Boolean 색인
name = np.array(['윤기','석준','원빈','은수','태헌'])
name
array(['윤기', '석준', '원빈', '은수', '태헌'], dtype='<U2')
arr_bool = np.array([True,False,False,True,True])
arr_bool
array([ True, False, False, True, True])
# boolean데이터의 array이용한 인덱싱
name[arr_bool]
array(['윤기', '은수', '태헌'], dtype='<U2')
name_score = np.array([[60,60],[70,70],[80,80],[90,90],[50,50]])
name_score
array([[60, 60],
[70, 70],
[80, 80],
[90, 90],
[50, 50]])
name_score[name=='석준']
array([[70, 70]])
name_score[arr_bool]
array([[60, 60],
[90, 90],
[50, 50]])
- sum함수
arr = np.random.randint(1,10, size=(2,2))
arr
array([[4, 1],
[6, 6]])
print(arr.sum())
print(np.sum(arr))
17
17
- mean함수
arr = np.random.randint(1,10, size=(2,2))
arr
array([[7, 6],
[3, 1]])
print(arr.mean())
print(np.mean(arr))
4.25
4.25
- 영화 평점 분석
data = np.loadtxt('/Users/min-yungi/Desktop/20210905pr/data/ratings.dat', delimiter='::',
dtype='int64')
data
array([[ 1, 1193, 5, 978300760],
[ 1, 661, 3, 978302109],
[ 1, 914, 3, 978301968],
...,
[ 6040, 562, 5, 956704746],
[ 6040, 1096, 4, 956715648],
[ 6040, 1097, 4, 956715569]])
print(data.ndim)
print(data.shape)
2
(1000209, 4)
# 모든 평점의 평균 구하기
rating_all_mean = data[:,2].mean()
rating_all_mean
3.581564453029317
# 각 사용자별 평점 평균 구하기
userID = np.unique(data[:,0])
print(userID)
print(userID.shape)
[ 1 2 3 ... 6038 6039 6040]
(6040,)
# 사용자 id가 1인 사람의 데이터
print(data[data[:,0]==1].shape)
(53, 4)
# 사용자 id가 1인 사람의 평점 데이터
print(data[data[:,0]==1,2])
[5 3 3 4 5 3 5 5 4 4 5 4 4 4 5 4 3 4 5 4 3 3 5 5 3 5 4 4 4 3 4 4 4 4 4 4 5
5 4 5 5 5 4 4 4 5 5 4 5 4 4 4 4]
# 사용자 id가 1인 사람의 평균 평점
print(data[data[:,0]==1,2].mean())
4.188679245283019
user_means = []
for ID in userID:
user_mean = data[data[:,0]==ID,2].mean()
user_means.append([ID,user_mean])
user_means[:5]
[[1, 4.188679245283019],
[2, 3.7131782945736433],
[3, 3.9019607843137254],
[4, 4.190476190476191],
[5, 3.1464646464646466]]
# csv파일로 저장
np.savetxt('/Users/min-yungi/Desktop/20210905pr/data/movie_id_mean.csv', user_means,
delimiter=',' ,fmt='%3f')
# 사용자 id가 2인 사람의 평균 평점
user_means[1]
[2, 3.7131782945736433]
data
array([[ 1, 1193, 5, 978300760],
[ 1, 661, 3, 978302109],
[ 1, 914, 3, 978301968],
...,
[ 6040, 562, 5, 956704746],
[ 6040, 1096, 4, 956715648],
[ 6040, 1097, 4, 956715569]])
# 평균 평점이 4.5이상인 사용자id 구하기
arr_means = np.array(user_means)
over4 = arr_means[arr_means[:,1]>=4.5,0].astype('int')
over4
array([ 91, 101, 215, 233, 266, 283, 288, 307, 372, 446, 447,
451, 567, 661, 682, 761, 764, 951, 953, 989, 1021, 1131,
1315, 1349, 1378, 1437, 1569, 1670, 1702, 1856, 1863, 1940, 1959,
1986, 2118, 2155, 2243, 2339, 2363, 2497, 2510, 2574, 2593, 2694,
2726, 2791, 2838, 2849, 2922, 2964, 3036, 3073, 3210, 3282, 3287,
3306, 3324, 3437, 3461, 3596, 3604, 3699, 3738, 3864, 3902, 4136,
4176, 4187, 4189, 4273, 4518, 4584, 4589, 4595, 4634, 4649, 4755,
4801, 4904, 4925, 4982, 5003, 5069, 5073, 5102, 5165, 5212, 5255,
5343, 5427, 5499, 5542, 5582, 5609, 5696, 5768, 5839, 5862, 5936,
5984])
# 최고 평균 평점 구하기
max_mean = arr_means[:,1].max()
max_mean
4.962962962962963
# 최고 평점 구하기
data[:,2].max()
5
댓글남기기