원래 파이썬은 복잡한 수치 계산을 위해 만들어진 프로그래밍이 아닌데 이를 보완해서 만들어진 것이 Numpy이다.
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
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]
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이게 하는 것도 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]
numpy
의 random
모듈의 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
모듈의 arange
함수를 사용하면 연속된 값들이 담겨 있는 배열을 생성할 수 있다. 파이썬의 range
함수와 비슷한 원리로 작동함
arange(m)
을 하면 0
부터 m-1
까지의 값들이 담긴 numpy array가 리턴됩니다.array1 = numpy.arange(6)
print(array1)
output
[0 1 2 3 4 5]
arange(n, m)
을 하면 n
부터 m-1
까지의 값들이 담긴 numpy array가 리턴됩니다.array1 = numpy.arange(2, 7)
print(array1)
output
[2 3 4 5 6]
arange(n, m, s)
를 하면 n
부터 m-1
까지의 값들 중 간격이 s
인 값들이 담긴 numpy array가 리턴됩니다.array1 = numpy.arange(3, 17, 3)
print(array1)
output
[ 3 6 9 12 15]
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)
이렇게 별명을 붙여주어서 간단하게 만들 수 있다.
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])
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])
인덱싱으로 배열에서 원하는 값만 뽑아올 수 있다.
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])
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])
일본에는 한식 열풍이 불고 있습니다. 기회를 엿본 영훈이는 대기업을 퇴사하고 신주쿠에 프랜차이즈 ‘흥부부대찌개’ 가맹점을 냈습니다.
그러나 보수적인 아버지께서는 번듯한 직장을 박차고 나온 영훈이가 못마땅합니다. 아버지를 안심시켜 드리기 위해 매달 매출을 보고하려고 하는데요. 엔화(¥)로 저장한 매출 데이터를 원화(₩)로 변환하는 작업이 필요합니다.
마침 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.])
흥부부대찌개 신주쿠점의 흥행에 성공한 영훈이는 여세를 몰아 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.])
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])
영훈이가 창업한 흥부부대찌개 신주쿠점은 이제 직장인들에게 소문난 맛집입니다. 그러나 매일같이 성공적인 것은 아닙니다. 목표 일 매출을 달성하지 못하는 날들이 아직 꽤 있거든요. 영훈이가 생각하는 성공적인 하루 매출은 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])
numpy array와 python list 는 매우 비슷하다
근데 왜 따로 쓰는걸까?
문법적인 차이
성능적인 차이
numpy
= 간단한 문법, 뛰어난 성능으로 효율적이다.
python list
는 다양한 자료형을 넣을 수 있지만 numpy array
는 같은 자료형만 배열에 넣을 수 있음
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
이 글은 저에게 많은 도움이 되었습니다.