%%html
<!-- 에디터 폰트를 조정합니다. -->
<style type='text/css'>
.CodeMirror{
font-size: 14px;
font-family: consolas;
</style>
# import
import numpy as np
# 버젼 확인
np.__version__
그림 1: NumPy 1차원, 2차원 및 3차원 배열과 Axis
#NumPy 객체의 정보를 출력
def pprint(arr):
print("type:{}".format(type(arr)))
print("shape: {}, dimension: {}, dtype:{}".format(arr.shape, arr.ndim, arr.dtype))
print("Array's Data:\n", arr)
# 파이썬 1차원 배열(list)로 NumPy 배열 생성
arr = [1, 2, 3]
a = np.array(arr)
pprint(a)
# 파이썬 2차원 배열로 NumPy 배열 생성, 원소 데이터 타입 지정
arr = [(1,2,3), (4,5,6)]
a= np.array(arr, dtype = float)
pprint(a)
arr = np.array(
[
[[1,2,3], [4,5,6]],
[[3,2,1], [4,5,6]]
]
, dtype = float)
a= np.array(arr, dtype = float)
pprint(a)
a = np.zeros((3,4))
pprint(a)
a = np.ones((2,3,4),dtype=np.int16)
pprint(a)
a = np.full((2,2),7)
pprint(a)
np.eye(4)
a = np.empty((4,2))
pprint(a)
a = np.array([[1,2,3], [4,5,6]])
b = np.ones_like(a)
pprint(b)
a = np.array([[1,2,3], [4,5,6]])
b = np.zeros_like(a)
pprint(b)
a = np.array([[1,2,3], [4,5,6]])
b = np.full_like(a, 7)
pprint(b)
a = np.array([[1,2,3], [4,5,6]])
b = np.empty_like(a)
pprint(b)
a = np.linspace(0, 1, 5)
pprint(a)
# endpoint : stop 값 포함 여부
a = np.linspace(0, 1, 5, endpoint=False)
pprint(a)
# dtype : 값 타입 설정
a = np.linspace(0, 1, 5, dtype=np.int)
pprint(a)
# linspace의 데이터 추출 시각화
import matplotlib.pyplot as plt
plt.plot(a, 'o')
plt.show()
a = np.arange(0, 10, 2, np.float)
pprint(a)
# arange의 데이터 추출 시각화
import matplotlib.pyplot as plt
plt.plot(a, 'o')
plt.show()
a = np.geomspace(0.1, 1, 20, endpoint=True)
pprint(a)
# logspace의 데이터 추출 시각화
import matplotlib.pyplot as plt
plt.plot(a, 'o')
plt.show()
난수 발생 및 배열 생성을 생성하는 numpy.random 모듈
np.random.normal
mean = 0
std = 1
a = np.random.normal(mean, std, (2, 3))
pprint(a)
data = np.random.normal(0, 1, 10000)
import matplotlib.pyplot as plt
plt.hist(data, bins=30) # bins 구간의 갯수
plt.show()
data = np.random.rand(10000)
print(data)
import matplotlib.pyplot as plt
plt.hist(data, bins=10)
plt.show()
a = np.random.randn(2, 4)
pprint(a)
data = np.random.randn(10000)
import matplotlib.pyplot as plt
plt.hist(data, bins=30)
plt.show()
a = np.random.randint(5, 10, size=(2, 4))
pprint(a)
a = np.random.randint(1, size=10)
pprint(a)
data = np.random.randint(-100, 100, 10000)
import matplotlib.pyplot as plt
plt.hist(data, bins=10)
plt.show()
np.random.rand(3,5)
np.random.random((3,5))
# seed 없이 random 사용
np.random.rand(2,3)
np.random.rand(2,3)
# seed 설정 후 random 사용
np.random.seed(0)
np.random.rand(2,3)
np.random.randint(0, 10, (2,3))
np.random.seed(0)
np.random.rand(2,3)
np.random.randint(0, 10, (2,3))
#데모 배열 객체 생성
arr = np.random.random((5,2,3))
#배열 타입 조회
type(arr)
# 배열의 shape 확인
arr.shape
# 배열의 길이
len(arr)
# 배열의 차원 수
arr.ndim
# 배열의 요소 수: shape(k, m, n) ==> k*m*n
arr.size
# 배열 타입 확인
arr.dtype
# 배열 요소를 int로 변환
# 요소의 실제 값이 변환되는 것이 아님
# View의 출력 타입과 연산을 변환하는 것
arr.astype(np.int)
# np.float으로 타입을 다시 변환하면 np.int 변환 이전 값으로 모든 원소 값이 복원됨
arr.astype(np.float)
np.info(np.ndarray.dtype)
# arange로 1부터 10 미만의 범위에서 1씩 증가하는 배열 생성
# 배열의 shape을 (3, 3)으로 지정
a = np.arange(1, 10).reshape(3, 3)
pprint(a)
# arange로 9부터 0까지 범위에서 1씩 감소하는 배열 생성
# 배열의 shape을 (3, 3)으로 지정
b = np.arange(9, 0, -1).reshape(3, 3)
pprint(b)
# 배열 연산: 뺄셈, -
a - b
np.subtract(a, b)
# 배열 연산: 덧셈, +
a + b
np.add(a, b)
# 배열 연산: 곱셈, *
a * b
np.multiply(a, b)
# 배열 연산: 나눗셈, /
a / b
np.divide(a, b)
# 배열 연산: 지수
np.exp(a)
# 배열 연산: 제곱근
np.sqrt(a)
# 배열 연산: sin
np.sin(a)
# 배열 연산: cos
np.cos(a)
# 배열 연산: tan
np.tan(a)
# 배열 연산: log
np.log(a)
# 배열 연산: dot product, 내적
np.dot(a, b)
a == b
a > b
np.array_equal(a, b)
집계함수에 AXIS를 지정하지 않으면 axis=None
axis=None
# arange로 1부터 10미만의 범위에서 1씩 증가하는 배열 생성
# 배열의 shape을 (3, 3)으로 지정
a = np.arange(1, 10).reshape(3, 3)
pprint(a)
a.sum(), np.sum(a)
a.sum(axis=0), np.sum(a, axis=0)
a.sum(axis=1), np.sum(a, axis=1)
a.min(), np.min(a)
a.min(axis=0), np.min(a, axis=0)
a.min(axis=1), np.min(a, axis=1)
a.max(), np.max(a)
a.max(axis=0), np.max(a, axis=0)
a.max(axis=1), np.max(a, axis=1)
a.cumsum(), np.cumsum(a)
a.cumsum(axis=0), np.cumsum(a, axis=0)
a.cumsum(axis=1), np.cumsum(a, axis=1)
a.mean(), np.mean(a)
a.mean(axis=0), np.mean(a, axis=0)
a.mean(axis=1), np.mean(a, axis=1)
np.median(a)
np.median(a, axis=0)
np.median(a, axis=1)
np.corrcoef(a)
a.std(), np.std(a)
a.std(axis=0), np.std(a, axis=0)
a.std(axis=1), np.std(a, axis=1)
Shape이 같은 두 배열에 대한 이항 연산은 배열의 요소별로 수행됩니다. 두 배열 간의 Shape이 다를 경우 두 배열 간의 형상을 맞추는 <그림 2>의 Broadcasting 과정을 거칩니다.
그림 2: 브로드캐스트 작동 원리
# 데모 배열 생성
a = np.arange(1, 25).reshape(4, 6)
pprint(a)
b = np.arange(25, 49).reshape(4, 6)
pprint(b)
a+b
a+100
# step 1: 스칼라 배열 변경
new_arr = np.full_like(a, 100)
pprint(new_arr)
# step 2: 배열 이항 연산
a+new_arr
# 데모 배열 생성
a = np.arange(5).reshape((1, 5))
pprint(a)
b = np.arange(5).reshape((5, 1))
pprint(b)
a + b
import numpy as np
# sample array
a = np.arange(10000000)
result = 0
%%time
for v in a:
result += v
result
%%time
result = np.sum(a)
result
#데모용 배열
a = np.random.randint(0, 9, (3, 3))
pprint(a)
copied_a1 =np.copy(a)
#배열 생성
unsorted_arr = np.random.random((3, 3))
pprint(unsorted_arr)
#데모를 위한 배열 복사
unsorted_arr1 = unsorted_arr.copy()
unsorted_arr2 = unsorted_arr.copy()
unsorted_arr3 = unsorted_arr.copy()
#배열 정렬
unsorted_arr1.sort()
pprint(unsorted_arr1)
#배열 정렬, axis=0
unsorted_arr2.sort(axis=0)
pprint(unsorted_arr2)
#배열 정렬, axis=1
unsorted_arr3.sort(axis=1)
pprint(unsorted_arr3)
# 데모 배열 생성
a0 = np.arange(24) # 1차원 배열
pprint(a0)
a1 = np.arange(24).reshape((4, 6)) #2차원 배열
pprint(a1)
a2 = np.arange(24).reshape((2, 4, 3)) # 3차원 배열
pprint(a2)
a0[5] # 5번 인덱스 요소 참조
# 5번 인덱스 요소 업데이트
a0[5] = 1000000
pprint(a0)
pprint(a1)
# 1행 두번째 컬럼 요소 참조
a1[0, 1]
# 1행 두번째 컬럼 요소 업데이트
a1[0, 1]=10000
pprint(a1)
pprint(a2)
# 2 번째 행, 첫번째 컬럼, 두번째 요소 참조
a2[1, 0, 1]
a2[1, 0, 1]=10000
pprint(a2)
# 데모 배열 생성
a1 = np.arange(1, 25).reshape((4, 6)) #2차원 배열
pprint(a1)
가운데 요소 가져오기
a1[1:3, 1:5]
a1[1:-1, 1:-1]
# 슬라이싱 배열
slide_arr = a1[1:3, 1:5]
pprint(slide_arr)
# 슬라이싱 결과 배열에 슬라이싱을 적용하여 4개 요소 참조
slide_arr2 = slide_arr[:, 1:3]
pprint(slide_arr2)
# 슬라이싱을 적용하여 참조한 4개 요소 업데이트 및 슬라이싱 배열 조회
slide_arr[:, 1:3]=99999
pprint(slide_arr)
pprint(a1)
# 데모 배열 생성
a1 = np.arange(1, 25).reshape((4, 6)) #2차원 배열
pprint(a1)
# 짝수인 요소 확인
# numpy broadcasting을 이용하여 짝수인 배열 요소 확인
even_arr = a1%2==0
pprint(even_arr)
# a1[a1%2==0] 동일한 의미입니다.
a1[even_arr]
np.sum(a1)
# 데이터 로딩
import pandas as pd
rains_in_seattle = pd.read_csv("Seattle2014.csv")
rains_arr = rains_in_seattle['PRCP'].values
print("Data Size:", len(rains_arr))
# 날짜 배열
days_arr = np.arange(0, 365)
days_arr
# 1월의 날수 boolean index 생성
condition_jan = days_arr < 31
condition_jan
# 40일 조회
condition_jan[:40]
#1월의 강수량 추출
rains_jan = rains_arr[condition_jan]
rains_jan
#강수량 데이터 수 (1월: 31일)
len(rains_jan)
# 1월 강수량 총합
np.sum(rains_jan)
# 1월 평균 강수향
np.mean(rains_jan)
arr = np.arange(1, 25).reshape((4, 6))
pprint(arr)
[arr[0,0], arr[1, 1], arr[2, 2], arr[3, 3]]
# 두 배열을 전달==> (0, 0), (1,1), (2,2), (3, 3)
arr[[0, 1, 2, 3], [0, 1, 2, 3]]
# 전체 행에 대해서, 1, 2번 컬럼 참조
arr[:, [1, 2]]
# 행렬 생성
a = np.random.randint(1, 10, (2, 3))
pprint(a)
#행렬의 전치
pprint(a.T)
# 데모 배열 생성
a = np.random.randint(1, 10, (2, 3))
pprint(a)
a.ravel()
b = a.ravel()
pprint(b)
b[0]=99
pprint(b)
pprint(a)
# 대상 행렬 속성 확인
a = np.random.randint(1, 10, (2, 3))
pprint(a)
result = a.reshape((3, 2, 1))
pprint(result)
#배열 생성
a = np.random.randint(1, 10, (2, 6))
pprint(a)
# shape 변경 - 요소 수 변경 없음
a.resize((6, 2))
pprint(a)
#배열 생성
a = np.random.randint(1, 10, (2, 6))
pprint(a)
# 요소수 12개에서 20개로 늘어남
# 늘어난 요소는 0으로 채워짐
a.resize((2, 10))
pprint(a)
#배열 생성
a = np.random.randint(1, 10, (2, 6))
pprint(a)
# 요소수 12개에서 9개로 줄임
a.resize((3, 3))
pprint(a)
# 데모 배열 생성
a = np.arange(1, 10).reshape(3, 3)
pprint(a)
b = np.arange(10, 19).reshape(3, 3)
pprint(b)
# axis 지정 없이 추가
result = np.append(a, b)
pprint(result)
#원본 배열을 변경하는 것이 아니며 새로운 배열이 생성됩니다.
pprint(a)
# axis = 0, 행방향
# axis 0 방향으로 b 배열 추가
result = np.append(a, b, axis=0)
pprint(result)
# axis = 1 열방향
# axis 1 방향으로 b 배열 추가
result = np.append(a, b, axis=1)
pprint(result)
# 데모 배열 생성
a = np.arange(1, 10).reshape(3, 3)
pprint(a)
# a 배열을 일차원 배열로 변환하고 1번 index에 99 추가
np.insert(a, 1, 999)
# a 배열의 axis 0 방향 1번 인덱스에 추가
# index가 1인 row에 999가 추가됨
np.insert(a, 1, 999, axis=0)
# a 배열의 axis 1 방향 1번 인덱스에 추가
# index가 1인 column에 999가 추가됨
np.insert(a, 1, 999, axis=1)
# 데모 배열 생성
a = np.arange(1, 10).reshape(3, 3)
pprint(a)
# a 배열을 일차원 배열로 변환하고 1번 index 삭제
np.delete(a, 1)
# a 배열의 axis 0 방향 1번 인덱스인 행을 삭제한 배열을 생성하여 반환
np.delete(a, 1, axis=0)
# a 배열의 axis 1 방향 1번 인덱스인 열을 삭제한 배열을 생성하여 반환
np.delete(a, 1, axis=1)
a
# 데모 배열
a = np.arange(1, 7).reshape((2, 3))
pprint(a)
b = np.arange(7, 13).reshape((2, 3))
pprint(b)
# axis=0 방향으로 두 배열 결합, axis 기본값=0
result = np.concatenate((a, b))
result
# axis=0 방향으로 두 배열 결합, 결과 동일
result = np.concatenate((a, b), axis=0)
result
# np.append(a, b, axis=0) 와 동일
np.append(a, b, axis=0)
# axis=1 방향으로 두 배열 결합, 결과 동일
result = np.concatenate((a, b), axis=1)
result
# np.append(a, b, axis=0) 와 동일
np.append(a, b, axis=1)
np.vstack
# 데모 배열
a = np.arange(1, 7).reshape((2, 3))
pprint(a)
b = np.arange(7, 13).reshape((2, 3))
pprint(b)
np.vstack((a, b))
# 4개 배열을 튜플로 설정
np.vstack((a, b, a, b))
np.hstack
np.hstack((a, b))
np.hstack((a, b, a, b))
NumPy는 배열을 수직, 수평으로 분할하는 함수를 제공합니다.
# 분할 대상 배열 생성
a = np.arange(1, 25).reshape((4, 6))
pprint(a)
# 수평으로 두 그룹으로 분할하는 함수
result = np.hsplit(a, 2)
result
result[0]
# 수평으로 두 그룹으로 분할하는 함수
result = np.hsplit(a, 3)
result
result[0]
# a.shape[1] -> 6
# a[:, :1], a[:, 1:3], a[:, 3:5], a[:, 5:]
rs = np.hsplit(a, [1,3,5])
rs[0]
rs[1]
rs[2]
rs[3]
# 분할 대상 배열 생성
a = np.arange(1, 25).reshape((4, 6))
pprint(a)
result=np.vsplit(a, 2)
result
np.array(result).shape
result=np.vsplit(a, 4)
result
np.array(result).shape
# row를 1, 2-3, 4번째 라인으로 구분
np.vsplit(a, [1, 3])