Numpy의 차원
1차원 데이터 : 벡터
2차원 데이터 : 행렬
3차원 이상 데이터 : 텐서
1차원 축은 행 (axis 0)
2차원 축은 열 (axis 1)
3차원 축은 채널 (axis 2)이라고 부른다.
*axis가 혼동이 올 수 있는데, array를 만들때 가장 바깥쪽의 리스트부터 축을 정의한 것이라고 이해하면 된다.
자세한 설명은 https://pybasall.tistory.com/129를 참조.
array 자료형
1
2
3
4
5
6
7
8
|
import numpy as np
list_data=[1,2,3]
array=np.array(list_data)
print(array)
print(array.size)
print(array.dtype)
print(array[2])
|
cs |
np.array는 기존 데이터를 넘파이 데이터로 바꾸어준다. list처럼 프린트하면 바로 내용을 다 볼 수 있고, numpy에서 제공하는 .size 또는 .dtype 등의 기능도 사용할 수 있다.
1씩 증가하는, 모두 0인, 모두 1인 행렬 만들기
1
2
3
4
5
6
7
8
9
10
|
import numpy as np
array1=np.arange(4)#1이상 4미만까지 정수 벡터 만들기
print(array1)
array2=np.zeros((4,4),dtype=float)#4x4이고 자료형이 float인 영행렬 만들기
print(array2)
array3=np.ones((3,3),dtype=str)#3x3이고 자료형이 문자열인 단위행렬 만들기
print(array3)
|
cs |
랜덤/난수 행렬, 정규분포를 따르는 값을 갖는 행렬 만들기
1
2
3
4
5
6
7
8
9
|
import numpy as np
#0이상 10미만을 원소로 갖는 3x3행렬 랜덤생성
array4=np.random.randint(0,10,(3,3))
print(array4)
#평균이 0 이고 표준편차가 1인 정규분포를 띄는 값을 원소로 갖는 3x3배열 생성
array5=np.random.normal(0,1,(3,3))
print(array5)
|
cs |
두 개의 벡터를 가로로 연결하기
1
2
3
4
5
6
7
8
|
import numpy as np
array1=np.array([1,2,3])
array2=np.array([4,5,6])
array3=np.concatenate([array1,array2])#두개의 벡터를 가로로 연결하기
print(array3.shape)#데이터의 모양보기
print(array3)
|
cs |
벡터를 행렬로 바꾸기
1
2
3
4
5
6
7
|
import numpy as np
array1=np.array([1,2,3,4])
array2=array1.reshape((2,2))#벡터를 2x2행렬로 바꾸기
print(array2.shape)
print(array2)
|
cs |
행렬을 세로로 연결하기
1
2
3
4
5
6
7
|
import numpy as np
array1=np.arange(4).reshape(1,4)#0~3숫자로 1x4 행렬 생성
array2=np.arange(8).reshape(2,4)#0~8숫자로 2x4 행렬 생성
array3=np.concatenate([array1,array2],axis=0)#배열을 세로로 합침.
print(array3)
|
cs |
행렬을 자르기
1
2
3
4
5
6
7
8
9
|
import numpy as np
array=np.arange(8).reshape(2,4)#0~8숫자로 2x4 행렬 생성
left, right=np.split(array, [2], axis=1)#array를 2번 열부터 자르기!
print(left.shape)
print(left)
print(right.shape)
print(right)
|
cs |
행렬의 사칙연산
numpy에서 벡터에 상수를 더하면 벡터의 각 원소에 상수를 더한 것처럼 연산된다.
벡터에 상수를 곱한것은 각 원소에 상수를 곱한 것처럼 연산된다.
1
2
3
4
5
6
|
import numpy as np
array=np.random.randint(1,10,size=4).reshape(2,2)
print(array)
result_array=array*10#각 원소에 10을 곱한다.
print(result_array)
|
cs |
원래 행렬은 사이즈가 맞아야 더해지지만 numpy에서는 조금 달라도 더해진다.
서로 다른 형태의 배열을 연산할때는 행 우선으로 수행된다.
2x2 행렬에 (0 1) 이라는 1x2행렬을 더하면 ((0 1) (0 1)) 이라는 2x2 행렬을 더한 것 처럼 연산된다는 뜻이다.
이것을 broadcasting이라고 한다.
1
2
3
4
5
6
7
|
import numpy as np
array1=np.arange(4).reshape(2,2)
array2=np.arange(2)
array3=array1+array2#array2의 행이 늘어나서 더해진것처럼 연산됨
print(array3)
|
cs |
만약 4x4행렬에 4x1행렬을 더한다면 이때는 행이 아니라 열이 늘어난것처럼 연산된다.
마스킹연산(참 거짓 여부가 담긴 행렬 받기)
마스킹연산: 각 원소에 대해 체크해서 참/거짓 여부가 담긴 행렬을 구한다.
1
2
3
4
5
6
7
8
9
10
|
import numpy as np
array1=np.arange(16).reshape(4,4)
print(array1)
array2=array1<10#마스킹연산 수행
print(array2)#참거짓이 담긴 행렬 출력
array1[array2]=100#이렇게 인덱스에 마스킹연산된행렬을 넣으면 참인 행렬에 대해서만 연산을 수행
print(array1)
|
cs |
행렬의 정보를 집계하기
다양한 집계함수도 제공.
1
2
3
4
5
6
7
|
import numpy as np
array=np.arange(16).reshape(4,4)
print("최댓값: ",np.max(array))
print("최솟값: ",np.min(array))
print("합계: ",np.sum(array))
print("평균값: ",np.mean(array))
|
cs |
각 열의 합 구하기
1
2
3
4
5
6
|
import numpy as np
array=np.arange(16).reshape(4,4)
print(array)
print("합계: ", np.sum(array, axis=0))#axis0을 따라서 합계를 계산
|
cs |
파일에 데이터 저장하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import numpy as np
array=np.arange(10)
np.save('saved.npy',array)#'saved.npy'라는 파일에 array 저장하기
result= np.load('saved.npy')#saved.npy라는 파일 불러오기
array1=np.arange(10)
array2=np.arange(10,20)
np.savez('saved.npz',data1=array1, data2=array2)#여러개 변수 저장하기
data=np.load('saved.npz')
result1=data['data1']#저장한 이름을 인덱스로 넣어서 접근하기
result2=data['data2']
|
cs |
오름차순으로 정렬하기
1
2
3
4
5
6
|
import numpy as np
array=np.array([5,9,10,3,1])
array.sort()#오름차순 정렬
print(array)#오름차순 출력
print(array[::-1])#인덱싱 기법으로 내림차순으로 출력하기
|
cs |
행렬의 경우 axis를 정의하여 각 행별로, 또는 각 열별로 정렬할 수도 있다.
1
2
3
4
5
6
7
8
9
10
11
12
|
import numpy as np
array=np.array([
[5,9,10,3,1],
[8,3,4,2,5],
[3,11,6,1,4]
])
array.sort(axis=0)# 각 열을 오름차순으로 정렬
print(array)
|
cs |
균일한 간격의 데이터 생성하기, 난수 시드 설정하기
1
2
3
4
5
6
7
8 9
|
import numpy as np
# 균일한 간격으로 데이터 생성
array=np.linspace(0,10,5)#0이상 10이하의 구간에서 5개의 등간격데이터 추출
print(array)
#난수의 재연(실행마다 동일)
np.random.seed(7)
print(np.random.randint(0,10,(2,3)))#이제는 실항할때마다 같은 값이 나옴
|
cs |
배열의 내용을 복사하기(주소값 복사를 방지하기)
1
2
3
4
5
6
7
|
import numpy as np
# Numpy 배열 객체 복사
array1=np.arange(0,10)
array2=array1.copy()
array2[0]=99
print(array1)
|
cs |
댓글