본문 바로가기
📁study archive/python으로 데이터분석

Numpy

by Hush 2022. 3. 29.

 

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

 

 

 

 

 

 

댓글