빅데이터 서비스 교육/PythonLibrary

PythonLib Numpy

Manly 2022. 5. 4. 12:48
반응형

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]])
 
lst22 = [[1.5,2.5,3.5],[1.3,2.3,3.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