lst22 = [[1.5,2.5,3.5],[1.3,2.3,3.6]]
arr22 = np.array(lst22,dtype=np.int64)
arr22
Numpy
- 빠르고 효율적인 연산 제공(고성능 과학계산)
- 다차원 배열 제공 (ndarray 클래스)
- 반복문 없이 전체 데이터 배열 연산 가능 -> 표준 수학 함수
import numpy as np
# 넘파이 모듈을 불러와서 np라고 부르겠다
# 어떤게 배열일까?
arr = np.array([1,2,3,4])
print(arr)
arr + arr -> 리스트는 [1 2 3 4 1 2 3 4]로 합쳐지는데 array 배열은 같은자리 끼리 합으로 계산
[1 2 3 4]
array([2, 4, 6, 8])
array 특징
- 동일한 자료형을 가지는 값들이 배열 형태로 존재
- n차원 형태로 배열 구성 가능
- 값 들은 양의 정수로 색인(index)을 가지고 있음
- ndarray == array
1차원배열: 옆으로 한방향
2차원배열: 옆,아래 두방향
3차원배열: 3방향
2차원이 여러개
# 1차원 배열 생성
lst1 = [1,2,3,4,5] # 단일리스트
arr1 = np.array(lst1) # 1차원 배열
arr1
array([1, 2, 3, 4, 5])
# 2차원 배열 생성
lst2 = [[1,2,3],[4,5,6]] # 이중리스트
arr2 = np.array(lst2) # 2차원 배열
arr2
# 방향축 axis
# 행방향 axis = 0
# 열방향 axis = 1
array([[1, 2, 3],
[4, 5, 6]])
arr22 = np.array(lst22)
arr22
array([[1.5, 2.5, 3.5],
[1.3, 2.3, 3.6]])
lst22 = [[1.5,2.5,3.5],[1.3,2.3,3.6]]
arr22 = np.array(lst22,dtype=np.int64)
arr22
array([[1, 2, 3],
[1, 2, 3]], dtype=int64)
# int -> float
# astype() 사용하면 데이터 타입 변환 가능
arr22 = arr22.astype(np.float64)
arr22
array([[1., 2., 3.],
[1., 2., 3.]])
범위 값을 지정하여 데이터를 생성하면서 배열 생성
lst_temp = []
for i in range(1,1001):
lst_temp.append(i)
ar=np.array(lst_temp)
ar
array([ 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, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
...........................................................1000
arg_arr = np.arange(1,1001) # 1차원으로 생성
arg_arr
array([ 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, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
...........................................................1000
arg_arr2 = np.arange(1,1001,10)
arg_arr2
array([ 1, 11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121,
131, 141, 151, 161, 171, 181, 191, 201, 211, 221, 231, 241, 251,
261, 271, 281, 291, 301, 311, 321, 331, 341, 351, 361, 371, 381,
391, 401, 411, 421, 431, 441, 451, 461, 471, 481, 491, 501, 511,
521, 531, 541, 551, 561, 571, 581, 591, 601, 611, 621, 631, 641,
651, 661, 671, 681, 691, 701, 711, 721, 731, 741, 751, 761, 771,
781, 791, 801, 811, 821, 831, 841, 851, 861, 871, 881, 891, 901,
911, 921, 931, 941, 951, 961, 971, 981, 991])
# 1. 배열의 크기 확인
# shape
arr.shape #1차원 크기 (데이터 개수,)
arr2.shape #2차원 크기 (행개수, 열개수)
(4,)
(2,3)
# 2. 전체 요소(data) 개수
# size
arr.size
arr2.size
4
6
# 3. 배열 안의 요소의 데이터 타입 확인
arr.dtype
arr2.dtype
dtype('int32')
# 4. 배열의 차원 확인
# ndim
arr.ndim
arr2.ndim
1
2
!pip install opencv-python
import cv2 # 이미지 처리 라이브러리
import matplotlib.pyplot as plt # 시각화 라이브러리
Collecting opencv-python
Downloading opencv_python-4.5.5.64-cp36-abi3-win_amd64.whl (35.4 MB)
Requirement already satisfied: numpy>=1.14.5 in c:\programdata\anaconda3\lib\site-packages (from opencv-python) (1.20.3)
Installing collected packages: opencv-python
Successfully installed opencv-python-4.5.5.64
Requirement already satisfied: opencv-python in c:\programdata\anaconda3\lib\site-packages (4.5.5.64)
Requirement already satisfied: numpy>=1.17.3 in c:\programdata\anaconda3\lib\site-packages (from opencv-python) (1.20.3)
Collecting opencv-python
Downloading opencv_python-4.5.5.64-cp36-abi3-win_amd64.whl (35.4 MB)
Requirement already satisfied: numpy>=1.19.3 in c:\programdata\anaconda3\lib\site-packages (from opencv-python) (1.20.3)
Installing collected packages: opencv-python
img = cv2.imread('a.png', cv2.IMREAD_COLOR)
plt.imshow(img)
<matplotlib.image.AxesImage at 0x29957b08910>

img = cv2.imread('a.png', cv2.IMREAD_COLOR)
img2 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) -> 색상 BGR 을 RGB로 바꾼다
plt.imshow(img2)
<matplotlib.image.AxesImage at 0x29957c1daf0>

# 속성확인
# 1. 크기확인
img2.shape # 행(y축), 열(x축), 채널(r,g,b)
# 2. 요소 개수
img2.size # data 정보 개수
# 3. 차원 크기
img2.ndim
(271, 426, 3)
346338
3
array 연산
# 요소별 연산
lst = [5,10,15]
arr1 = np.array(lst)
arr1 + 10
# 두 데이터의 크기가 맞춰진 후 연산이 된다.
# [5,10,15] + [10,10,10] -> 브로드캐스팅
array([15, 20, 25])
# 배열간 연산
arr1
arr2 = np.array([20,21,22])
arr1 + arr2
array([25, 31, 37])
arr1 * arr2
array([100, 210, 330])
Indexing&Slicing
- 데이터 접근하기 위해서
arr1 = np.arange(1,11)
arr1
# 3이라는 데이터에 접근하기
# index ->2
arr1[2]
arr1[9]
#인덱스번호 0,2번째 자리 접근
arr1[[0,2]]
# 숫자 5와 9 동시에 인덱싱!
arr1[[4,8]]
3
10
array([1, 3])
array([5, 9])
# 슬라이싱
# [첫인덱스:끝인덱스]
# 숫자 3부터 7까지 접근
arr1[2:7] # 첫인덱스는 포함 끝인덱스는 미포함이라 원하는 끝인덱스 +1
#처음부터 끝까지 슬라이싱
arr1[0:10]
arr1[:] #첫 시작 기본값0, 끝인덱스 기본값 끝까지
array([3, 4, 5, 6, 7])
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
데이터 값 변경
- 위치 접근(인덱싱,슬라이싱) -> 대입
# 3,4,5 숫자를 10으로 변경해보자
arr1[2:5]=10
arr1
array([ 1, 2, 10, 10, 10, 6, 7, 8, 9, 10])
2차원 인덱싱, 슬라이싱
# reshape(행,열) 배열 모양 재지정
# -1: 특정하게 지정한 숫자값에 맞춰서 알아서 정리
arr2 = np.arange(50).reshape(-1,10)
arr2
array([[ 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]])
# 이차원배열[행] -> 하나만 넣으면 자동으로 행으로
arr2[1]
arr2[3]
arr2[[1,3]] # 리스트로 묶으면 행으로 접근
arr2[0:2]
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39])
array([[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39]])
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
# 이차원배열[행,열]
arr2[4,2]
arr2[[2,4],2]
arr2[4,[0,3]]
42
array([22, 42])
array([40, 43])
# 이차원배열[:,원하는 열]
arr2[:,1]
array([ 1, 11, 21, 31, 41])
arr2[:,[3,6]]
array([[ 3, 6],
[13, 16],
[23, 26],
[33, 36],
[43, 46]])
arr2[0:2,0:8] -> 첫시작값 0은 생략가능
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[10, 11, 12, 13, 14, 15, 16, 17]])
arr2[0:4,8:10]
array([[ 8, 9],
[18, 19],
[28, 29],
[38, 39]])
arr2[2:5,[0,2,4]]
arr2[2:5,0:5:2]
array([[20, 22, 24],
[30, 32, 34],
[40, 42, 44]])
Boolean 인덱싱: 특정 조건에 맞는 데이터가 있다면 접근
#score = np.random.randint(50,100,size=8)
score>=75np.random.seed(2) # 랜덤값 뽑고 뽑은값 고정
print(score)
# 75점 이상인 데이터 접근
score>=75
score[score>=75] # -> True인 자리에 해당하는 데이터만 출력
name = np.array(['현우','지영','상희','준영','현승','태민','철웅','진석'])
name[score>=75]
array([57, 73, 66, 74, 65, 76, 58, 57])
array([ True, False, False, False, True, True, True, True])
array([92, 98, 77, 75, 92])
array(['현우', '현승', '태민', '철웅', '진석'], dtype='<U2')
numpy함수
# 더하는 함수
np.sum(score)
613
# 평균 구하는 함수
np.mean(score)
76.625
# 제곱근 구하는 함수
np.sqrt(score)
array([9.59166305, 8.1240384 , 7.21110255, 7.81024968, 9.89949494,
8.77496439, 8.66025404, 9.59166305])
# 절댓값 구하는 함수
np.abs(np.array([-1,0,-3,2]))
array([1, 0, 3, 2])
# null인지 판별하는 함수
np.isnan(score)
array([False, False, False, False, False, False, False, False])
영화 평점 데이터 분석
- 최종목표: 각 사용자별 평점 평균 구해보자
#값 1::1193::5::978300760
# 0번째열 : 사용자id
# 1번째열 : 영화id
# 2번째열 : 평점데이터(1~5)
# 3번째열 : 타임스탬프(시간) 실습사용x
data = np.loadtxt('ratings.dat', delimiter='::', dtype=np.int64)
data[:5]
array([[ 1, 1193, 5, 978300760],
[ 1, 661, 3, 978302109],
[ 1, 914, 3, 978301968],
[ 1, 3408, 4, 978300275],
[ 1, 2355, 5, 978824291]], dtype=int64)
# shape
print('행크기:',data.shape[0])
print('열크기:',data.shape[1])
# 차원
print('차원수:',data.ndim)
행크기: 1000209
열크기: 4
차원수: 2
# 1. 평점 접근
# 2. 평균 함수 연결
np.mean(data[:,2])
3.581564453029317
사용자 아이디 중복없이 값 확인
user_id=np.unique(data[:,0])
user_id.size
user_id.shape
array([ 1, 2, 3, ..., 6038, 6039, 6040], dtype=int64)
6040
(6040,)
사용자 아이디가 1번인 데이터만 접근
# 사용자 아이디 열 접근
# Boolean 인덱싱 -> data 적용
data[data[:,0]==1]
array([[ 1, 1193, 5, 978300760],
[ 1, 661, 3, 978302109],
[ 1, 914, 3, 978301968],
[ 1, 3408, 4, 978300275],
[ 1, 2355, 5, 978824291],
[ 1, 1197, 3, 978302268],
[ 1, 1287, 5, 978302039],
[ 1, 2804, 5, 978300719],
[ 1, 594, 4, 978302268],
[ 1, 919, 4, 978301368],
[ 1, 595, 5, 978824268],
[ 1, 938, 4, 978301752],
[ 1, 2398, 4, 978302281],
[ 1, 2918, 4, 978302124],
[ 1, 1035, 5, 978301753],
[ 1, 2791, 4, 978302188],
[ 1, 2687, 3, 978824268],
[ 1, 2018, 4, 978301777],
[ 1, 3105, 5, 978301713],
...............등등등.................
data[data[:,0]==1][:,2] # 1번사용자의 평점들
array([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], dtype=int64)
np.mean(data[data[:,0]==1][:,2]) # 1번 사용자의 평점들의 평균
4.188679245283019
# 각 사용자 별 평점 평균 구하기
user_id_mean = [] # 사용자별 평점 평균 저장하는 빈 리스트
for user in user_id:
user_mean=np.mean(data[data[:,0]==user][:,2])
user_id_mean.append([user,user_mean]) # append는 하나만 넣을 수 있기때문에 list형식으로 두 데이터를 한번에
user_id_mean
[[1, 4.188679245283019],
[2, 3.7131782945736433],
[3, 3.9019607843137254],
[4, 4.190476190476191],
[5, 3.1464646464646466],
[6, 3.9014084507042255],
[7, 4.32258064516129],
[8, 3.884892086330935],
[9, 3.7358490566037736],
[10, 4.114713216957606],
[11, 3.2773722627737225],
[12, 3.8260869565217392],
[13, 3.388888888888889],
[14, 3.32],
[15, 3.3233830845771144],
[16, 3.0285714285714285],
[17, 4.075829383886256],
[18, 3.6491803278688524],
[19, 3.5725490196078433],
[20, 4.083333333333333],
[21, 2.909090909090909],
[22, 3.0673400673400675],
[23, 3.3157894736842106],
.......등등.......
user_id_mean2 = np.array(user_id_mean) #user_id_mean은 list 형식으로 list형식은
#boolean인덱싱이 불가능하므로 array로 변환
user_id_mean2
array([[1.00000000e+00, 4.18867925e+00],
[2.00000000e+00, 3.71317829e+00],
[3.00000000e+00, 3.90196078e+00],
...,
[6.03800000e+03, 3.80000000e+00],
[6.03900000e+03, 3.87804878e+00],
[6.04000000e+03, 3.57771261e+00]])
# 영화 평점 평균이 4점 이상인 사용자 아이디 확인해보기
# 몇명일까?
user_id_mean2[user_id_mean2[:,1]>=4][:,0].astype(np.int64)
array([ 1, 4, 7, ..., 6027, 6032, 6034], dtype=int64)
a = user_id_mean2[user_id_mean2[:,1]>=4][:,0].astype(np.int64)
a[:50] #50개만 눈으로 확인
a.size
array([ 1, 4, 7, 10, 17, 20, 27, 36, 43, 46, 53, 54, 55,
64, 65, 67, 69, 74, 75, 76, 81, 82, 86, 88, 91, 97,
101, 103, 105, 106, 109, 112, 121, 124, 125, 126, 128, 129, 130,
138, 150, 152, 153, 156, 158, 161, 162, 164, 171, 177], dtype=int64)
1544
넘파이
- 수학 계산에 능함
- 다차원 배열 제공
- 배열 생성 np.array(), np.arange().reshape()
- 인덱싱, 슬라이싱 -> 1차원[[인덱스1,인덱스2]], 1차원 [시작:끝]
- 2차원[행], 2차원[:,열], 2차원[행,열]
- 속성 키워드 : 크기 .shape , 요소개수 .size, 차원수 .ndim, 데이터타입확인 dtype
'빅데이터 서비스 교육 > PythonLibrary' 카테고리의 다른 글
PythonLib Pandas (0) | 2022.05.04 |
---|---|
PythonLib 모듈, 데이터분석 (0) | 2022.05.04 |