Numpy

yiseonline·2023년 7월 19일
0

datascience

목록 보기
3/28
post-thumbnail

3.1 numpy란?

원래 파이썬은 복잡한 수치 계산을 위해 만들어진 프로그래밍이 아닌데 이를 보완해서 만들어진 것이 Numpy이다.


3.2 Numpy array의 생김새

import numpy
array1 = numpy.array([2,3,5,7,11,13,17,19,23,29,31])
array1
type(array1)
array1.shape

output

array([ 2,  3,  5,  7, 11, 13, 17, 19, 23, 29, 31])
numpy.ndarray
(11,) #뒤에 오는 쉼표는 해당 튜플이 단일 요소를 가지고 있는 것을 나타내기 위해 사용됩니다.

2차원 배열

array2 = numpy.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
type(array2)
array2
array2.shape

output

numpy.ndarray #ndarray = n차원 배열이라는 뜻이다
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
(3, 4) # 행이 3개고 열이 4개인 2차원 배열이라는 뜻

__.size = 배열의 요소가 몇개인지 알려줌
ex)

array1.size
array2.size

output

11
12

3.3 Numpy Array를 만드는 다양한 방법

파이썬 리스트를 통해 생성

array1 = numpy.array([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31])
    
print(array1)

output

[ 2  3  5  7 11 13 17 19 23 29 31]

균일한 값으로 생성

numpy모듈의 full메소드를 사용하면 모든 값이 같은 배열을 생성할 수 있음

array1 = numpy.full(6, 7)
    
print(array1)

output

[7 7 7 7 7 7]

모든 값이 0인 numpy array 생성

full 메소드를 사용할 수 있지만 zeros 메소드를 사용하면 더 간편할 수 있다

array1 = numpy.full(6, 0)
array2 = numpy.zeros(6, dtype=int)
    
print(array1)
print()
print(array2)

output

[0 0 0 0 0 0]

[0 0 0 0 0 0]

모든 값이 1인 numpy array 생성

모든 값이 1이게 하는 것도 zeros 대신에 ones를 사용하면 된다

array1 = numpy.full(6, 1)
array2 = numpy.ones(6, dtype=int)
    
print(array1)
print()
print(array2)

output

[1 1 1 1 1 1]

[1 1 1 1 1 1]

랜덤한 값들로 생성

numpyrandom 모듈의 random함수를 사용하면 된다

array1 = numpy.random.random(6)
array2 = numpy.random.random(6)
    
print(array1)
print()
print(array2)

output

[0.42214929 0.45275673 0.57978413 0.61417065 0.39448558 0.03347601]

[0.42521953 0.65091589 0.94045742 0.18138103 0.27150749 0.8450694 ]

연속된 값들이 담긴 numpy array 생성

numpy 모듈의 arange 함수를 사용하면 연속된 값들이 담겨 있는 배열을 생성할 수 있다. 파이썬의 range함수와 비슷한 원리로 작동함

  • 파라미터가 1개일 때
    arange(m)을 하면 0부터 m-1까지의 값들이 담긴 numpy array가 리턴됩니다.
array1 = numpy.arange(6)
print(array1)

output

[0 1 2 3 4 5]
  • 파라미터가 2개일 때
    arange(n, m)을 하면 n부터 m-1까지의 값들이 담긴 numpy array가 리턴됩니다.
array1 = numpy.arange(2, 7)
print(array1)

output

[2 3 4 5 6]
  • 파라미터가 3개일 때
    arange(n, m, s)를 하면 n부터 m-1까지의 값들 중 간격이 s인 값들이 담긴 numpy array가 리턴됩니다.
array1 = numpy.arange(3, 17, 3)
print(array1)

output

[ 3  6  9 12 15]

3.4 모듈 별명 지어주기

import A as B = A모듈의 별명을 B로 지어주겠다는 뜻

import numpy

array1 = numpy.full(6,0)
array2 = numpy.zeros(6)
array3 = numpy.full(6,6)
array4 = numpy.ones(9)
array5 = numpy.random.random(6)
array6 = numpy.random.random(10)

이런 코드를

import numpy as np

array1 = np.full(6,0)
array2 = np.zeros(6)
array3 = np.full(6,6)
array4 = np.ones(9)
array5 = np.random.random(6)
array6 = np.random.random(10)

이렇게 별명을 붙여주어서 간단하게 만들 수 있다.

3.5 실습 1

1~100 까지의 수가 배열에 담기게 만들어라

arr = numpy.arange(1,101)
arr

output

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])

3.6 실습 2

1~100 이하의 자연수 중에서 3의 배수만 배열에 담기게 만들어라

arr = np.arange(3,101,3)
arr

output

array([ 3,  6,  9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51,
       54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99])

3.7 인덱싱, 슬라이싱

인덱싱으로 배열에서 원하는 값만 뽑아올 수 있다.

array1 = np.array([2,3,5,7,11,13,17,19,23,29,31])

array1[0]

array1[2]

array1[-1]

array1[-2]

array1[[1,3,4]] # 여러개도 가능하다

output

2

5

31

29

array([3,7,11])

슬라이싱은 : (콜론)을 사용해서 배열의 특정 범위를 지정하여 해당 부분을 선택할 수 있다

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

array1[array2]

array1[2:7] # 인덱스 2번부터 6번 (7-1) 까지 잘림

array1[0:7] # 0~6

array1[:7] # 시작 ~ 6

array1[2:] # 2번 부터 끝까지 

array1[2:11:2] # 2~10 까지 그리고 간격은 2로

array1[2:11:3] # 2~10 까지 그리고 간격은 3으로

output

array([5, 3, 7])

array([ 5,  7, 11, 13, 17])

array([ 2,  3,  5,  7, 11, 13, 17])

array([ 2,  3,  5,  7, 11, 13, 17])

array([ 5,  7, 11, 13, 17, 19, 23, 29, 31])

array([ 5, 11, 17, 23, 31])

array([ 5, 13, 23])

3.8 numpy 기본 연산

numpy는 수치연산을 쉽게 하도록 나온 것 !! 기본 파이썬 보다 연산에 있어서 문법이 쉽다

array1 = np.arange(10)
array2 = np.arange(10,20)

array1

array1 * 2

array1 / 2

array1 +2

array1 **2

array1

output

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])

array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # 위에서 한 계산들을 저장해주지 않았기 때문에 다시 불러와도 처음과 같음

배열과 배열의 연산

array1 = np.arange(10)
array2 = np.arange(10,20)

array1
array2

array1 + array2

array1*array2

array1/array2

output

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28])

array([  0,  11,  24,  39,  56,  75,  96, 119, 144, 171])

array([0.        , 0.09090909, 0.16666667, 0.23076923, 0.28571429,
       0.33333333, 0.375     , 0.41176471, 0.44444444, 0.47368421])

3.9 실습 1 (신주쿠 흥부부대찌개)

일본에는 한식 열풍이 불고 있습니다. 기회를 엿본 영훈이는 대기업을 퇴사하고 신주쿠에 프랜차이즈 ‘흥부부대찌개’ 가맹점을 냈습니다.

그러나 보수적인 아버지께서는 번듯한 직장을 박차고 나온 영훈이가 못마땅합니다. 아버지를 안심시켜 드리기 위해 매달 매출을 보고하려고 하는데요. 엔화(¥)로 저장한 매출 데이터를 원화(₩)로 변환하는 작업이 필요합니다.

마침 numpy를 배운 우리가 도와줄 수 있겠네요. 엔화 매출이 담겨 있는 파이썬 리스트가 주어졌습니다. 1엔에 10.08원이라고 가정하고, 원화 매출이 담긴 numpy array를 만들어 출력해 주세요.

반복문은 사용하면 안 됩니다!

주의 사항: 자동 채점 과제입니다. 정답 출력 코드는 print가 없는 방식으로 작성해 주세요. (예시: won_array)

code

import numpy as np

revenue_in_yen = [
    300000, 340000, 320000, 360000, 
    440000, 140000, 180000, 340000, 
    330000, 290000, 280000, 380000, 
    170000, 140000, 230000, 390000, 
    400000, 350000, 380000, 150000, 
    110000, 240000, 380000, 380000, 
    340000, 420000, 150000, 130000, 
    360000, 320000, 250000
]

revenue_in_yen_array = np.array(revenue_in_yen) #
won_array = revenue_in_yen_array*10.08
won_array

ㄴ 푸는 과정에서 자꾸 can't multiply sequence by non-int of type 'float' 라는 에러가 떴는데 이것은 리스트를 정수가 아닌 부동 소수점 형태로 곱할 수 없다는 것을 나타내기 때문에 revenue_in_yen리스트를 넘파이 배열로 변환해서 곱셈 연산을 수행하였더니 해결됐다

output

array([3024000., 3427200., 3225600., 3628800., 4435200., 1411200.,
       1814400., 3427200., 3326400., 2923200., 2822400., 3830400.,
       1713600., 1411200., 2318400., 3931200., 4032000., 3528000.,
       3830400., 1512000., 1108800., 2419200., 3830400., 3830400.,
       3427200., 4233600., 1512000., 1310400., 3628800., 3225600.,
       2520000.])

3.10 실습2 흥부부대찌개 LA 진출

흥부부대찌개 신주쿠점의 흥행에 성공한 영훈이는 여세를 몰아 LA에도 가맹점을 하나 냈습니다.

이제 아버지께 매출을 보고하기 위한 프로세스가 조금 복잡해졌습니다. 각 지점의 매출을 원화로 변환시키고 더해야 하죠. 1엔에 10.08원, 1달러에 1138원이라고 가정하세요. 그리고 두 지점의 매출의 합이 원화로 담긴 numpy array를 만들어 출력해주세요.

반복문은 사용하면 안 됩니다!

주의: 자동 채점 과제입니다. 정답 출력 코드는 print가 없는 방식으로 작성해 주세요. (예시: won_array)

import numpy as np

revenue_in_yen = [
    300000, 340000, 320000, 360000, 
    440000, 140000, 180000, 340000, 
    330000, 290000, 280000, 380000, 
    170000, 140000, 230000, 390000, 
    400000, 350000, 380000, 150000, 
    110000, 240000, 380000, 380000, 
    340000, 420000, 150000, 130000, 
    360000, 320000, 250000
]

revenue_in_dollar = [
    1200, 1600, 1400, 1300, 
    2100, 1400, 1500, 2100, 
    1500, 1500, 2300, 2100, 
    2800, 2600, 1700, 1400, 
    2100, 2300, 1600, 1800, 
    2200, 2400, 2100, 2800, 
    1900, 2100, 1800, 2200, 
    2100, 1600, 1800
]

# 여기에 코드를 작성하세요
yen_array = np.array(revenue_in_yen)
won_array1 = yen_array*10.08

dollar_array = np.array(revenue_in_dollar)
won_array2 = dollar_array *1138

won_array = won_array1+won_array2

# 테스트 코드
won_array

output

array([4389600., 5248000., 4818800., 5108200., 6825000., 3004400.,
       3521400., 5817000., 5033400., 4630200., 5439800., 6220200.,
       4900000., 4370000., 4253000., 5524400., 6421800., 6145400.,
       5651200., 3560400., 3612400., 5150400., 6220200., 7016800.,
       5589400., 6623400., 3560400., 3814000., 6018600., 5046400.,
       4568400.])

3.11 numpy boolean 연산

np.where = 값이 True인 인덱스만 추출해줌

import numpy as np

array1 = np.array([2,3,5,7,11,13,17,19,23,29,31])

array1 > 4
array1%2 ==0

output

array([False, False,  True,  True,  True,  True,  True,  True,  True,
        True,  True])
        
array([ True, False, False, False, False, False, False, False, False,
       False, False])

ㄴ 맞으면 True 틀리면 False를 반환 (배열 형식 그대로 반환해주는 특징)

booleans = np.array([True, True, False, True, True, False, True, True, True, False, True])

np.where(booleans) #True인 값의 인덱스들 추출

array1>4
np.where(array1>4)

filter = np.where(array1>4)
filter

array1[filter]

output

(array([ 0,  1,  3,  4,  6,  7,  8, 10]),)

array([False, False,  True,  True,  True,  True,  True,  True,  True,
        True,  True])
(array([ 2,  3,  4,  5,  6,  7,  8,  9, 10]),)

(array([ 2,  3,  4,  5,  6,  7,  8,  9, 10]),)

array([ 5,  7, 11, 13, 17, 19, 23, 29, 31])

3.12 실습 흥부부대찌개 목표 일 매출

영훈이가 창업한 흥부부대찌개 신주쿠점은 이제 직장인들에게 소문난 맛집입니다. 그러나 매일같이 성공적인 것은 아닙니다. 목표 일 매출을 달성하지 못하는 날들이 아직 꽤 있거든요. 영훈이가 생각하는 성공적인 하루 매출은 20만 엔입니다.

성공적이지 않은 날의 매출만 골라서 보고 싶습니다. 20만 엔 이하의 매출만 담긴 numpy array를 출력해주세요.
반복문은 사용하면 안 됩니다!

주의 사항: 자동 채점 과제입니다. 정답 출력 코드는 print 없이 작성해 주세요. (예시: bad_days_revenue)

import numpy as np

revenue_in_yen = [
    300000, 340000, 320000, 360000, 
    440000, 140000, 180000, 340000, 
    330000, 290000, 280000, 380000, 
    170000, 140000, 230000, 390000, 
    400000, 350000, 380000, 150000, 
    110000, 240000, 380000, 380000, 
    340000, 420000, 150000, 130000, 
    360000, 320000, 250000
]

# 여기에 코드를 작성하세요
revenue_yen = np.array(revenue_in_yen) # 배열 생성
bools = np.array(revenue_yen<200000) # 20만엔이 되는지 안되는지 true, false로 보여주는 배열
filter = np.where(revenue_yen<200000) # 20만엔이 안되는 true 들의 인덱스들을 모아놓은 배열 
bad_days_revenue=revenue_yen[filter] # 그 인덱스의 해당하는 값 (=20만엔 안넘었던 애들) 추출한 배열

# 테스트 코드
bad_days_revenue

output

array([140000, 180000, 170000, 140000, 150000, 110000, 150000, 130000])

3.13 numpy array vs python list

numpy array와 python list 는 매우 비슷하다

근데 왜 따로 쓰는걸까?

  1. 문법적인 차이

  2. 성능적인 차이
    numpy = 간단한 문법, 뛰어난 성능으로 효율적이다.
    python list는 다양한 자료형을 넣을 수 있지만 numpy array는 같은 자료형만 배열에 넣을 수 있음

3.14 numpy 기본 통계

최댓값, 최솟값

max 메소드와 min 메소드를 사용하여 최댓값과 최솟값을 구할 수 있다

import numpy as np

array1 = np.array([14,6,13,21,23,31,9,5])

print(array1.max())
print(array1.min())

output

31
5

평균값

mean 메소드를 사용하면 numpy array의 평균값을 구할 수 있다.

import numpy as np

array1 = np.array([14,6,13,21,23,31,9,5])

print(array1.mean())

output

15.25

중앙값

median 메소드를 사용하면 중간값을 구할 수 있는데 특이하게 median은 numpy array의 메소드가 아니라 numpy의 메소드이다

import numpy as np

array1 = np.array([8,12,9,15,16])
array2 = np.array([14,6,13,21,23,31,9,5])

print(np.median(array1))
print(np.median(array2))

output

12.0
13.5 # array2는 개수가 짝수개여서 중간이 13과 14로 되었기 때문에 13과 14의 중간인 13.5로 추출

표준편차, 분산

std()로 표준편차를, var()로 분산을 구할 수 있음

import numpy as np

array1 = np.array([14,6,13,21,23,31,9,5])

print(array1.std())
print(array1.var())

output

8.496322733983215
72.1875

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

이 글은 저에게 많은 도움이 되었습니다.

답글 달기