1 !pip install numpy # NumPy 라이브러리가 설치 되어 있지 않을때만.
2 import numpy as np # 개발자들 십중팔구 numpy는 np라는 별칭(alias)을 사용
1995년 Numeric이라는 이름으로 출시한 후, 2006년 NumPy로 명칭을 바꾸고 꾸준히 개선됨.
특히 복잡한 행렬 계산(선형대수)과 관련된 기능을 많이 제공하여 범용적으로 사용된다.
파이썬 모듈(라이브러리, 패키지)에는 버전을 확인할 수 있는 __version__ 속성을 지니도록 권장하고 있으며 넘파이 역시 이를 갖고 있다.
1 print(np.__version__) # 넘파이 버전 확인
1 my_first_array = np.array([0, 0.5, 1]) # 리스트로부터 ndarray 객체 생성(float와 int의 혼합)
2 print(my_first_array)
3 print(type(my_first_array))
4 print(type(my_first_array[0])) # float64로의 변환
5 print(my_first_array.dtype) # 전체 원소의 자료형
1 my_second_array = np.array((1, 1, 1)) # 튜플로부터 ndarray 객체 생성 (int만으로 구성)
2 print(my_second_array)
3 print(type(my_second_array))
4 print(type(my_second_array[0]))
5 print(my_first_array + my_second_array) # 배열 덧셈
6 print(my_first_array - my_second_array) # 배열 뺄셈
7 print(my_first_array * my_second_array) # 배열 원소별 곱셈
8 print(my_first_array / my_second_array) # 배열 원소별 나눗셈
9 print(my_first_array // my_second_array) # 배열 원소별 몫 연산
10 print(my_first_array % my_second_array) # 배열 원소별 나머지 연산
1 A = np.array([[1, 2], [3, 4]]) # (2,2) shape의 배열
2 B = np.array([[1, 1], [2, 2]])
3 print(A, "A.shape:", A.shape, "A.ndim:", A.ndim)
4 print("A.size:",A.size, "len(A):", len(A), "\n")
5 print(B, "\n")
6 print(A*B, "\n") # 배열 원소별 곱셈
7 print(A@B) # 배열의 곱 (1)
8 print(A.dot(B)) # 배열의 곱(2)
9 print(np.dot(A,B)) # 배열의 곱 (3)
shape은 구체적인 배열의 모양을 알려주고 ndim은 총 자원 수를 알려준다. (len(A.shape) == A.ndim) size는 배열 내의 모든 원소 개수를 알려주고 배열에서 사용하는 len 함수는 가장 바깥 (혹은 첫) 차원에서의 값을 나타낸다.
(len(A) == A.shape[0])
1 print(np.arange(5)) # 0부터(디폴트) 5이전까지 1 간격(디폴트)
2 print(np.arange(1, 5)) # 1부터 5이전까지 1간격(디폴트)
3 print(np.arange(1, 5, 2)) # 1부터 5이전까지 2간격
1 print(np.linspace(1, 50), len(np.linspace(1, 50))) # 1부터 50까지 총 50개 구간(디폴트)
2 print(np.linspace(1, 10, 5) # 1부터 10까지 총 5개 구간
1 print(np.zeros(5)) # float64 자료형으로 0을 채움
2 print(np.zeros(5).dtype)
3 C = np.array([[1,2],[3,4],[5,6]])
4 print(np.zeros_like(C)) # 특정 시퀀스 객체와 같은 shape을 가지되 0으로 채우기
5 print(np.zeros_like(C).dtype) # zeros와는 다르게 int64 자요형으로 0을 채움
6 d = [1,2]
7 print(np.zeros_like(d))
8 e = (1, 2, 3)
9 print(np.zeros_like(e))
1 print(np.full((2,3),3))
2 print(np.full((2,3),3).dtype)
3 print(np.full(shape=(2,3),fill_value=3.))
4 print(np.full((2,3), 3.)dtype)
1 print(np.eye(3)) # (3,3)으로 단위행렬 객체 생성
2 print(np.eye(3)*3) # (3,3)으로 값이 3인 대각행렬 생성
1 print(np.random.randn(3))
2 print(np.random.randn(3,3))
3 print(np.random.randn(2,2,2))
표준정규분포란, 평균이 0이고 표준 편차가 1인 정규분포를 의미한다.
1 my_array = np.arange(10)
2 my_new_array = my_array.reshape(2,5) # reshape 속성
3 my_new_array2 = np.reshape(my_array, (2,-1))
# reshape 메소드 -1은 인터프리터가 자동으로 연산
4 print(my_new_array)
5 print(my_new_array2)
1 my_array = np.arange(10)
2 my_new_array2 = my_array.reshape(3,-1)
1 print(my_new_array) # (2,5) shape
2 my_new_array = my_new_array.T
3 print(my_new_array) # (5,2) shape
4 my_new_array = np.transpose(my_new_array)
5 print(my_new_array) # (2,5) shape
6 my_3d _array = np.arange(8).reshape(2,2,2)
7 print(my_3d _array)
8 my_3d_array= my_3d_array.T # 2D가 아닐 경우에는?
-> 항상 처음과 마지막 axis간의 치환이 이뤄진다
9 print(my_3d_array)
1 my_3d_array = np.arange(8).reshape(2,2,2)
2 print(my_3d_array)
3 my_3d_array = np.swapaxes(my_3d_array, 0, 1)
# 0번째와 1번째 축간의 교환
4 print(my_3d_array)
1 count_to_ten = np.arange(1,11)
2 count_to_twenty = np.hstack[count_to_ten,count_to_ten+10])
3 print(count_to_twenty)
1 count_to_twenty = np.vstack([count_to_ten, count_to_ten+10))
2 print(count_to_twenty)
1 a = np.arange(1,5).reshape(2,2)
2 print(a, "ndim:", a.ndim, "shape:", a.shape)
3 print(np.stack([a, a+4, a+8]), np.stack([a, a+4, a+8]).shape) # axis = 0
4 print(np.stack([a, a+4, a+8], axis=1), np.stack([a, a+4, a+8], axis=1).shape)
5 print(np.stack([a, a+4, a+8], axis=2), np.stack([a, a+4, a+8], axis=2).shape)
1 a = np.arange(1,5).reshape(2,2)
2 print(a, "ndim:", a.ndim, "shape:", a.shape)
3 print(np.concatenate([a, a+4, a+8]), np.concatenate([a, a+4, a+8]).shape)
4 print(np.concatenate([a, a+4, a+8], axis=1), np.concatenate([a, a+4, a+8], axis=1).shape)
5 print(np.concatenate(a, 314, a18), axis=2) 축오류 발생
1 x = np.arange(6)
2 print(np.split(x,2)) # 2등분
3 print(np.split(x,3)) # 3등분
4 print(np splik 4) # 6개 원소를 4등분할 수 없음 (오류)
1 x = np.arange(6)
2 print(np.split(x,(2,3))) # 인덱스 2와 3을 기준으로 분리
3 print(np.split(x,[2,4,5,91)) # 인덱스 2, 4, 5, 그리고 9를 기준으로 분리
1 x = np.arange(6).reshape(2,3)
2 print(x)
3 print(np.split(x, 2)) # axis=0
4 print(np.split(x, 3, axis=1))
5 print(np.spligx, 2.axis=1) # 3개 원소를 2등분 불가능 (오류)