데이터를 효율적인 고정 타입 데이터 버퍼에 저장하는 다양한 방식을 제공하는데 파이썬 3.3부터 제공하는 array라는 내장 모듈이 그 중 하나.
파이썬 내장 모듈인 array 모듈은 데이터에 효율적인 저장소만을 제공해주는 반면, numpy는 효율적인 저장소를 제공할 뿐만 아니라 효율적인 연산도 가능하게 해준다.
import numpy as np
np.array(생성할 데이터, 데이터 타입)
##예시
a = [[1,2,3],[4,5,6]] #리스트에서 생성
arr1= np.array(a) # numpy로 배열 정의
print(arr1)
>[[1 2 3]
[4 5 6]]
print(arr1.shape) # 차원. 크기를 확인할때 사용
>(2,3)
a=np.arange(6)
print(a)
> [ 0 1 2 3 4 5 ]
a = a.reshape((3,2)) #차원 변환
print(a)
>[[0 1]
[2 3]
[4 5]]
array1 = np.arange(10)
print(array1)
array2 = array1.reshape(-1, 5)
print('array2.shape :', array2.shape)
array3 = array1.reshape(5, -1)
print('array3.shape :', array3.shape)
>[0 1 2 3 4 5 6 7 8 9]
array2.shape : (2, 5)
array1 = np.arange(8)
array5 = array3d.reshape(-1, 1)
> [[0], [1], [2], [3], [4], [5], [6], [7]]
iii) 행렬의 타입
print(arr2.dtype) # 타입 확인
>(int64) # 앞에는 자료형을 의미하며 뒤에는 메모리를 의미한다.
# 타입 변경
array_int = np.array([1, 2, 3])
array_float = array_int.astype('float64')
# 1차원
print(arr1[0,0]) #원소 접근법 행,열의 원소에 접근한다.
> 1
# 2차원
array2d:
[[1 2 3]
[4 5 6]
[7 8 9]]
print(array2d[0:2, 0:2])
> [[1 2]
[4 5]]
## 펜시 인덱싱 - 인덱스 집합을 지정하면 해당 위치의 인덱스에 해당하는 ndarray를 반환
array1d = np.arange(1, 10)
array2d = array1d.reshape(3, 3)
print(array2d[[0, 1], 0:2])
>[[1 2]
[4 5]]
### 불린 인덱싱 - 조건필터링과 검색을 동시 사용
array1d = np.arange(1, 10)
print(array1d[array1d>5])
[6 7 8 9]
### 1차원
org_array = np.array([3, 1, 9, 5])
print('원본 행렬 :', org_array)
# np.sort()로 정렬
sort_array1 = np.sort(org_array)
print('np.sort() 호출 후 반환된 정렬 행렬 :', sort_array1)
print('np.sort() 호출 후 원본 행렬 :', org_array)
# ndarray.sort()로 정렬
sort_array2 = org_array.sort()
print('org_array.sort() 호출 후 반환된 행렬 :', sort_array2)
print('org_array.sort() 호출 후 원본 행렬 :', org_array)
### 2차원
array2d = np.array([[8, 12],
[7, 1]])
sort_array2d_axis0 = np.sort(array2d, axis=0)
print('로우 방향으로 정렬 :\n', sort_array2d_axis0)
sort_array2d_axis1 = np.sort(array2d, axis=1)
print('칼럼 방향으로 정렬 :\n', sort_array2d_axis1)
print(np.arange(10)) # 1~9까지의 1차원 배열 생성 list의 range
> [0 1 2 3 4 5 6 7 8 9]
np.eye(N=3, M=5, # 총 행렬의 크기는 3x5
k=1, # identity matrix의 시작은 1열부터 시작하라
dtype=np.int8)
array([[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]], dtype=int8)
###대각 행렬이라고 하며 어떤 행렬을 곱하더라도 해당 행렬이 출력되도록
print(np.zeros((2,2))) # 영행렬 생성 (0으로 가득찬 행렬)
> [[0. 0.] # 타입이 float
[0. 0.]]
### 0으로 초기화된 shape 차원의 ndarray 배열 객체 반환
print(np.ones((2,2))) # 유닛행렬 생성 (1로 가득찬 행렬)
> [[1. 1.] # 타입이 float
[1. 1.]]
### 1로 초기화된 shape 차원의 ndarray 배열 객체 반환
print(np.full((2,2),5) # 모든 원소가 5인 행렬
### 모든 값을 지정한 수로 초기화된 shape 차원의 ndarray 배열 객체 반환
>print(np.empty((2,2))) #
> [[0. 0.] # 안에 수는 다른 쓰레기 수가 들어가 있을수 있음
[0. 0.]]
### 모든 값을 초기화되지 않은 shape 차원의 ndarray 배열 객체 반환
a = np.array([1,2,3])
b = np.array([4,5,6])
### 더하기
d= np.add(a, b) # c = a+b와 같다
print(d)
>[5 7 9]
###뺴기
d= np.subtract(a, b) # c= a-b와 같다.
print(d)
>[-3 -3 -3]
###곱하기
d= np.multiply(a, b) # c= a*b와 같다
print(d)
>[ 4 10 18]
###나누기
d= np.divide(a, b) # c= a/b와 같다
print(d)
###2차원일 경우
arr = np.array([[1,2,3],[4,5,6]])
arr1 = np.array([[7,8,9],[10,11,12]])
d= np.add(arr, arr1)
print(d)
>[[ 8 10 12]
[14 16 18]]
function | Description |
---|---|
abs,fabs | array요소 단위로 절대값 반환 |
sqrt | array요소 단위로 음아 아닌 절대값 반환 |
square | array요소 단위로 제곱 반환 |
exp | exponential 값 반환 |
log,log10 | 입력 array의 로그 값 반환 |
sign | 숫자의 부호 반환 |
cos,cosh,sin | 삼각함수 |
function | Description |
---|---|
diag | input이 2차원 행렬 : 대각 원소만을 추출해 1차원 배열로 반환 또한 k를 지정해 k칸 치우친 방향의 대각성분도 획득 가능 1차원 행렬일 경우 input값을 차례대로 가지는 대각행렬 생성 |
dot | 1차원 :두 array의 내적을 계산 2차원 : 행렬곱 반환 |
trace | sum of the diagonal elements |
det | matrix determinant |
eig | eigenvalues and eigenvectors of a square matrix |
inv | inverse of a square matrix |
pinv | Moore-Penrose pseudo-inverse of a matrix |
qr | QR decomposition |
## 내적 : 1 x 1 차원
a = np.array([1, 3, 5])
b = np.array([4, 2, 1])
np.dot(a, b)
> 15
# element-wise 방식으로 각 원소를 곱한 값들을 더한 내적 연산 수행
# 참고로 행렬의 원소 개수가 일치해야된다.
## 행렬 곱 : 2 x 2차원
a = np.array([[1, 3], [2, 4]])
b = np.array([[1, 6], [3, 0]])
print(np.dot(a, b))
>[[10 6]
[14 12]]
# 행렬곱