Numpy에 대한 개념, 다양한 Ndarray를 생성하는 방법을 정리합니다.

Numpy


Numpy를 사용하는 이유

  1. 파이썬 list보다 뛰어난 성능 (작업 처리 속도가 빠르다)

  2. 메모리 사이즈가 작다 (파이썬 리스트보다 적은 메모리로 처리 가능하다)

  3. 유용한 Built-in function (선형대수, 통계 관련 함수 등)

1
2
3
# Numpy 모듈 불러오기
# 통상적으로 np로 alias를 지어준다.
import numpy as np

Ndarray

  • numpy에서 사용되는 다차원 리스트를 표현할 때 사용되는 데이터 타입

  • ndarray는 C언어로 구현된다.

  • 즉, ndarray에 생성되는 모든 원소들이 컴퓨터의 물리적 메모리에 위치하게 된다.

  • 때문에 array를 순회하거나 연산을 반복적으로 처리할때 빠르게 처리할 수 있다.

numpy vectorization

  • 1부터 100까지의 ndarray를 1개의 객체로 인식해서 연산을 처리하는 것

  • python의 list는 각각의 객체를 loop를 통해 연산하기 때문에 처리속도에서 많은 차이가 발생한다.

ndarray

다양한 함수로 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

  • 초기화가 되지 않는다.

  • 어떤 값이든 상관없이 초기화된 값으로 ndarray를 생성하고 싶을때 사용

1
np.empty((3, 4))
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

  • 특정 값으로만 이뤄진 ndarray를 생성하고자 할때사용

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]])
1
np.full((3, 4, 2), 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로 생성하기

  • 처음 2개의 원소는 시작과 끝을 의미

  • 마지막 원소는 나누고자 하는 수 = 전체 원소의 수

  • 즉, 처음 수와 마지막 수 사이를 지정한 개수만큼 쪼개라!

  • 단, 각 원소간의 차는 동일하게 생성된다.

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]])
1
x.reshape(5, 3)
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]]])
1
x.reshape(5, 4)
  • 기존 x는 1부터 15까지 총 15개의 원소로 이뤄져 있다.

  • x.reshape(5, 4) 는 5행 4열로 reshape하라는 명령어 -> 20개의 원소가 필요

  • 즉, reshape를 쓸때는 변경하려는 형태의 원소의 수 = 기존 원소의 수 가 성립되어야 한다.

댓글남기기