Numpy에 대한 개념, 다양한 Ndarray를 생성하는 방법을 정리합니다.
Numpy
Numpy를 사용하는 이유
-
파이썬 list보다 뛰어난 성능 (작업 처리 속도가 빠르다)
-
메모리 사이즈가 작다 (파이썬 리스트보다 적은 메모리로 처리 가능하다)
-
유용한 Built-in function (선형대수, 통계 관련 함수 등)
1
2
3
| # Numpy 모듈 불러오기
# 통상적으로 np로 alias를 지어준다.
import numpy as np
|
Ndarray
-
numpy에서 사용되는 다차원 리스트를 표현할 때 사용되는 데이터 타입
-
ndarray는 C언어로 구현된다.
-
즉, ndarray에 생성되는 모든 원소들이 컴퓨터의 물리적 메모리에 위치하게 된다.
-
때문에 array를 순회하거나 연산을 반복적으로 처리할때 빠르게 처리할 수 있다.
numpy vectorization

다양한 함수로 ndarray 생성하기
np.array 함수로 생성하기
일반적으로 많이 사용되는 방식은 아니다.
1
2
3
4
| # 1차원의 ndarray생성
array1 = np.array([1,2,3,4])
print('array1 type:',type(array1))
print('array1 array 형태:',array1.shape) #1차원(벡터) 이기때문에 원소가 1개이다.
|
array1 type: <class 'numpy.ndarray'>
array1 array 형태: (4,)
1
2
3
4
5
| # 2차원의 ndarray 생성
array2 = np.array([[2, 3, 4], [1, 2, 5]])
print('array2 type:',type(array2))
print('array2 array 형태:',array2.shape)
|
array2 type: <class 'numpy.ndarray'>
array2 array 형태: (2, 3)
1
2
3
4
| #3차원의 ndarray 생성
array3 = np.array([[1,2,3]])
print('array3 type:',type(array3))
print('array3 array 형태:',array3.shape)
|
array3 type: <class 'numpy.ndarray'>
array3 array 형태: (1, 3)
1
| print('array1: {:0}차원, array2: {:1}차원, array3: {:2}차원'.format(array1.ndim,array2.ndim,array3.ndim))
|
array1: 1차원, array2: 2차원, array3: 2차원
ndarray의 데이터 타입
1
2
| list1 = [1,2,3]
print(type(list1))
|
<class 'list'>
1
2
3
4
5
| # list를 array로 변경
array1 = np.array(list1)
print(type(array1))
print(array1, array1.dtype)
|
<class 'numpy.ndarray'>
[1 2 3] int32
1
2
3
4
| # 리스트에 숫자와 문자가 혼용된 경우
list2 = [1, 2, 'test']
array2 = np.array(list2)
print(array2, array2.dtype)
|
['1' '2' 'test'] <U11
1
2
3
4
| # 리스트에 정수와 실수가 혼용된 경우
list3 = [1, 2, 3.0]
array3 = np.array(list3)
print(array3, array3.dtype)
|
[1. 2. 3.] float64
astype()를 통해 형변환 하기
1
2
3
4
| # int -> float
array_int = np.array([1, 2, 3])
array_float = array_int.astype('float64')
print(array_float, array_float.dtype)
|
[1. 2. 3.] float64
1
2
3
| # float -> int
array_int1= array_float.astype('int32')
print(array_int1, array_int1.dtype)
|
[1 2 3] int32
1
2
3
| array_float1 = np.array([1.1, 2.1, 3.1])
array_int2= array_float1.astype('int32')
print(array_int2, array_int2.dtype)
|
[1 2 3] int32
np.arange 함수로 생성하기
pytyon의 range함수와 사용법 동일
1
2
| # 0부터 10이전 사이의 원소로 1차원 ndarray생성
np.arange(10)
|
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
| # 1을 포함해서 10이전까지의 원소로 1차원의 ndarray생성
np.arange(1, 10)
|
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
| # 1을 포함해서 2원소씩 간격을 두어 10 이전까지의 원소로 1차원의 ndarray생성
np.arange(1, 10, 2)
|
array([1, 3, 5, 7, 9])
1
2
| # 5를 포함해서 101이전까지의 원소들을 가지고 5칸씩 띄어서 ndarray 생성
np.arange(5, 101, 5)
|
array([ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65,
70, 75, 80, 85, 90, 95, 100])
np.ones, np.zeros로 생성하기
np.ones
-
모든 원소가 1인 ndarray생성
-
tuple 형식으로 입력해야 한다.
1
2
| # 4행 5열의 모든 원소가 1인 ndarray 생성
np.ones((4, 5))
|
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
1
2
| # 2행 3열로 구성된 3차원의 모든 원소가 1인 ndaray 생성
np.ones((2, 3, 4))
|
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
np.zeros
-
모든 원소가 0인 ndarray생성 함수
-
tuple 형식으로 입력해야 한다.
1
2
| # 모든 원소가 0인 2행 3열의 2차원 ndarray
np.zeros((2,3))
|
array([[0., 0., 0.],
[0., 0., 0.]])
1
2
| # 모든 원소가 0인 2행 3열의 3차원 ndarray
np.zeros((2,3,8))
|
array([[[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.]],
[[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.]]])
1
2
| # 모든 원소가 0인 2행 3열의 4차원 ndarray
np.zeros((2, 3, 8, 8))
|
array([[[[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.]],
[[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.]],
[[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.]]],
[[[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.]],
[[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.]],
[[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.]]]])
np.empty, np.full로 생성하기
np.empty
array([[1.46883187e-311, 2.86558075e-322, 0.00000000e+000,
0.00000000e+000],
[0.00000000e+000, 5.64233733e-067, 5.95084320e-091,
6.01032905e-067],
[1.26071326e-076, 1.39313909e+165, 6.48224659e+170,
5.82471487e+257]])
np.full
1
2
| # 3행 4열의 2차원 ndarray를 7로만 채워서 생성
np.full((3,4),7)
|
array([[7, 7, 7, 7],
[7, 7, 7, 7],
[7, 7, 7, 7]])
array([[[7, 7],
[7, 7],
[7, 7],
[7, 7]],
[[7, 7],
[7, 7],
[7, 7],
[7, 7]],
[[7, 7],
[7, 7],
[7, 7],
[7, 7]]])
np.eye로 생성하기
-
단위 행렬 생성
-
단위 행렬 : 모든 대각선의 값은 1, 나머지는 0인 행렬
-
행/열의 값이 모두 같아야 하기 때문에 값을 1개만 입력한다.
-
추후 선형대수학 계산 등을 할때 많이 사용한다.
1
2
| # 3행 3열의 단위행렬 형태의 ndarray 생성
np.eye(3)
|
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
1
2
| # 5행 5열의 단위행렬 형태의 ndarray 생성
np.eye(5)
|
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
np.linspace로 생성하기
1
2
| # 즉, 1과 10사이의 원소를 3개로 나눠서 값을 생성
np.linspace(1, 10, 3)
|
array([ 1. , 5.5, 10. ])
1
2
3
| # 1과 10 사이의 값을 4개로 나눠서 생성
# 각 숫자간의 차는 동일
np.linspace(1, 10, 4)
|
array([ 1., 4., 7., 10.])
1
2
| # 1과 10 사이의 값을 4개로 나눠서 생성
np.linspace(1, 10, 5)
|
array([ 1. , 3.25, 5.5 , 7.75, 10. ])
reshape 함수 활용
- ndarray의 형태, 차원을 바꾸기 위해 사용
1
2
3
| x = np.arange(1, 16)
print(x)
# 1차원 벡터형태
|
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
1
2
| # 1차원이기 때문에 1개의 원소만 나온다.
x.shape
|
(15,)
1
2
3
| # 기존 1차원 값 = 벡터(x)를 2차원 값으로 형태 변경
# 3행 5열의 행렬로 바꿔라!
x.reshape(3, 5)
|
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15]])
1
2
| # 5개의 3행 1열로 변경 (3차원)
x.reshape(5, 3, 1)
|
array([[[ 1],
[ 2],
[ 3]],
[[ 4],
[ 5],
[ 6]],
[[ 7],
[ 8],
[ 9]],
[[10],
[11],
[12]],
[[13],
[14],
[15]]])
-
기존 x는 1부터 15까지 총 15개의 원소로 이뤄져 있다.
-
x.reshape(5, 4) 는 5행 4열로 reshape하라는 명령어 -> 20개의 원소가 필요
-
즉, reshape를 쓸때는 변경하려는 형태의 원소의 수 = 기존 원소의 수 가 성립되어야 한다.
댓글남기기