Python

[Python] 파이썬 넘파이(Numpy) 배열 예제 및 사용방법 총정리

넘파이(Numpy)의 사용 이유

기본적으로 파이썬은 배열 개념이 없습니다. 그리고 다차원 배열에 대한 내부 함수 지원이 없습니다. numpy는 그런면에서 파이썬에 단비와 같다고 볼 수 있어요. 배열 처리가 필요할때 사용하시면 됩니다. 넘파이는 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리 할 수 있도록 지원하는 파이썬의 라이브러리 입니다. NumPy는 데이터 분석 및 과학적 수치 계산을 위한 훌륭한 함수들을 제공합니다. 넘파이를 사용하기위해서는 numpy 모듈을 임포트(import)해야합니다.

 

파이썬 넘파이 1차원 배열 만들기

1차원 배열을 만들기 위해 array(), arange(), linspace() 함수 중에 하나를 사용합니다.

1. array() 예제

배열의 크기(size)보다 큰 인덱스값을 적용하여 값을 가져오려고 시도하며 IndexError: index 4 is out of bounds for axis 0 with size 3 와 같은 오류가 발생됩니다. a.size()함수를 사용하여 배열의 크기를 체크하세요.

import numpy as np

a = np.array([1, 2, 3])
print(f'a 자료형 : {type(a)}')
print(a)
print(f'배열의 첫번째 요소 출력: {a[0]}')
print(f'배열의 크기: {a.size}')


#실행결과
a 자료형 : <class 'numpy.ndarray'>
[1 2 3]
배열의 첫번째 요소 출력: 1
배열의 크기: 3


print(f'배열의 첫번째 요소 출력: {a[4]}')

#실행결과
#IndexError: index 4 is out of bounds for axis 0 with size 3

 

2. arange() 예제 – 등간격

arange()함수는 배열의 시작값과 끝값 그리고 배열을 생성할 간격을 지정할 수 있습니다. 간격 인자값은 생략가능하며,생략한 경우 시작과 끝 사이의 모든 값으로 1차원 배열을 생성합니다.

import numpy as np

a = np.arange(3, 10)
print(f'a 자료형 : {type(a)}')
print(a)
print(f'배열의 첫번째 요소 출력: {a[0]}')
print(f'배열의 크기: {a.size}')
 

#실행결과
a 자료형 : <class 'numpy.ndarray'>
[3 4 5 6 7 8 9]
배열의 첫번째 요소 출력: 3
배열의 크기: 7
import numpy as np

a = np.arange(1, 20, 3)
print(f'a 자료형 : {type(a)}')
print(a)
print(f'배열의 첫번째 요소 출력: {a[0]}')
print(f'배열의 크기: {a.size}')


#실행결과
a 자료형 : <class 'numpy.ndarray'>
[ 1  4  7 10 13 16 19]
배열의 첫번째 요소 출력: 1
배열의 크기: 7

 

3. linspace() 예제

linspace()함수는 배열의 시작값과 끝값 그리고 배열에 생성할 요소(값)의 개수를 지정합니다. 아래 예제는 5부터 100까지 숫자 사이에서 5개의 값을 배열로 생성합니다. 

import numpy as np

a = np.linspace(5, 100, 5)
print(f'a 자료형 : {type(a)}')
print(a)
print(f'배열의 첫번째 요소 출력: {a[0]}')
print(f'배열의 크기: {a.size}')


#실행결과
a 자료형 : <class 'numpy.ndarray'>
[  5.    28.75  52.5   76.25 100.  ]
배열의 첫번째 요소 출력: 5.0
배열의 크기: 5

 

배열의 요소 인자를 생략하는경우 시작과 끝 사이의 값을 디폴트로 50개 생성합니다. 

import numpy as np

a = np.linspace(5, 100)
print(f'a 자료형 : {type(a)}')
print(a)
print(f'배열의 첫번째 요소 출력: {a[0]}')
print(f'배열의 크기: {a.size}')


#실행결과
a 자료형 : <class 'numpy.ndarray'>
[  5.           6.93877551   8.87755102  10.81632653  12.75510204
  14.69387755  16.63265306  18.57142857  20.51020408  22.44897959
  24.3877551   26.32653061  28.26530612  30.20408163  32.14285714
  34.08163265  36.02040816  37.95918367  39.89795918  41.83673469
  43.7755102   45.71428571  47.65306122  49.59183673  51.53061224
  53.46938776  55.40816327  57.34693878  59.28571429  61.2244898
  63.16326531  65.10204082  67.04081633  68.97959184  70.91836735
  72.85714286  74.79591837  76.73469388  78.67346939  80.6122449
  82.55102041  84.48979592  86.42857143  88.36734694  90.30612245
  92.24489796  94.18367347  96.12244898  98.06122449 100.        ]
배열의 첫번째 요소 출력: 5.0
배열의 크기: 50

 

배열의 요소를 생성시 배열의 간격값이 궁금하면 retstep=True를 인자값으로 주면 되며, 디폴트값은 retstep=False입니다. 다음 샘플코드의 출력결과를 보면 배열요소 제일 뒤에 간격값이 노출되고 있습니다.  7.25값의 간격으로 5개의 요소를 가지는 배열을 생성하였습니다. 특이한 점은  retstep=True를 적용하면 자료형이 튜플(tuple)입니다. 

import numpy as np

a = np.linspace(1, 30, 5, retstep=True)
print(f'a 자료형 : {type(a)}')
print(a) 


#실행결과
a 자료형 : <class 'tuple'>
(array([ 1.  ,  8.25, 15.5 , 22.75, 30.  ]), 7.25)

 

배열에 사칙연산을 하여 새로운 배열을 생성할 수도 있습니다.

import numpy as np

a = np.linspace(1, 30, 5)
print(f'a 자료형 : {type(a)}')
print(a)


b = a*3
print(f'b 자료형 : {type(b)}')
print(b)


#실행결과
a 자료형 : <class 'numpy.ndarray'>
[ 1.    8.25 15.5  22.75 30.  ]

b 자료형 : <class 'numpy.ndarray'>
[ 3.   24.75 46.5  68.25 90.  ]

 

파이썬 넘파이(numpy) 임의값(random)으로 배열 만들기

[Python] 예제로 알아보는 파이썬 넘파이(numpy) 랜덤(난수) 배열 생성: numpy.random

 

넘파이(numpy) 배열의 초기화 

초기화 관련하여 numpy.zeros(), numpy.ones(), numpy.empty(), numpy.full()함수를 제공합니다. zeros()함수는 배열의 모든 요소를 0으로 초기화합니다. ones()함수는 모든 요소를 1로, empty()함수는 인자로 생성할 배열의 차원을 list나 tuple 자료형으로 지정합니다. dtype 파라미터는 디폴트값이 float64입니다. 변경을 원할경우 지정해줍니다. dtype파라미터는 zeros(), ones(), empty() 함수에서 모두 사용가능합니다. 

 

1. zeros() 함수를 사용한 1차원 배열 예제

a = np.zeros(7)
print(f'a 자료형 : {type(a)}')
print(a)


#실행결과
a 자료형 : <class 'numpy.ndarray'>
[0. 0. 0. 0. 0. 0. 0.]

 

2. zeros(), ones()를 사용한 2차원 배열 예제

import numpy as np

a = np.zeros((3, 3))
print(f'a 자료형 : {type(a)}')
print(a)

b = np.ones((3, 3), dtype='int32')
print(f'b 자료형 : {type(b)}')
print(b)


c = np.empty((3, 3))
print(f'c 자료형 : {type(c)}')
print(c)



#실행결과
a 자료형 : <class 'numpy.ndarray'>
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
 
b 자료형 : <class 'numpy.ndarray'>
[[1 1 1]
 [1 1 1]
 [1 1 1]]
 
c 자료형 : <class 'numpy.ndarray'>
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

 

3. zeros()함수를 사용한 3차원 배열 예제

import numpy as np
 
a = np.zeros((3, 2, 4))
print(f'a 자료형 : {type(a)}')
print(a)


#실행결과
a 자료형 : <class 'numpy.ndarray'>

[[[0. 0. 0. 0.]
  [0. 0. 0. 0.]]

 [[0. 0. 0. 0.]
  [0. 0. 0. 0.]]

 [[0. 0. 0. 0.]
  [0. 0. 0. 0.]]]
  
  
  
  

a = np.zeros((3, 2, 4), dtype=int)
print(f'a 자료형 : {type(a)}')
print(a)


#실행결과
a 자료형 : <class 'numpy.ndarray'>

[[[0 0 0 0]
  [0 0 0 0]]

 [[0 0 0 0]
  [0 0 0 0]]

 [[0 0 0 0]
  [0 0 0 0]]]

 

numpy.full()함수를 사용하면, 배열의 초기값을 지정할 수 있습니다. 다음 예제는 1차원배열, 2차원 배열, 3차원 배열의 요소의 값을 모두 동일한 값 2로 초기화 하는 예제입니다. 2차원 배열부터는 튜플자료형으로 파라미터값을 설정하면되고, fill_value파라미터를 꼭 지정해야합니다. fill_value 파라미터 누락시 TypeError: full() missing 1 required positional argument: ‘fill_value’ 오류가 발생합니다. 배열이 몇 차원 배열인지 확인하려면 numpy.dim를 사용합니다.

import numpy as np

#1차원 배열
a = np.full(3, 2)
print(f'1차원 배열 생성n', a)
print(f'몇 차원 배열인가요? {a.ndim}')


#2차원 배열
a = np.full((2, 3), fill_value=2)
print(f'n1차원 배열 생성n', a)
print(f'몇 차원 배열인가요? {a.ndim}')


#3차원 배열
a = np.full((2, 3, 5), fill_value=2)
print(f'n1차원 배열 생성n', a)
print(f'몇 차원 배열인가요? {a.ndim}')






#실행결과
1차원 배열 생성
 [2 2 2]
몇 차원 배열인가요? 1

1차원 배열 생성
 [[2 2 2]
 [2 2 2]]
몇 차원 배열인가요? 2

1차원 배열 생성
 [[[2 2 2 2 2]
  [2 2 2 2 2]
  [2 2 2 2 2]]

 [[2 2 2 2 2]
  [2 2 2 2 2]
  [2 2 2 2 2]]]
몇 차원 배열인가요? 3

 

numpy.eye()함수를 사용하면 정방행렬(행과 열이 같은 행렬)과 같은 2차원 배열을 생성할 수 있습니다. 초기값으로 대각선 방향의 요소 값은 1.0으로 초기화 되며,나머지 요소의 값은 0.0으로 초기화 됩니다. 만약 정방행렬이 아닌 사용자 정의에 따른 행과 열을 가진 배열을 만들려면 eye()함수의 인자값으로 2개를 주면 됩니다. 첫번째 인자는몇 개의 배열을 만들것인지을 의미하며, 두번째 인자는 하나의 배열당 몇개의 요소를 초기화 할 것인지를 설정합니다. 아래 샘플코드의 실행결과를 보면 이해가 되실거에요.

import numpy as np

a = np.eye(3)
print(a)
print(f'몇 차원 배열인가요? {a.ndim}')


a = np.eye(4)
print(a)
print(f'몇 차원 배열인가요? {a.ndim}')


a = np.eye(9, 6)
print(a)
print(f'몇 차원 배열인가요? {a.ndim}')


#실행결과
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
몇 차원 배열인가요? 2

[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
몇 차원 배열인가요? 2

[[1. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]]
몇 차원 배열인가요? 2

 

넘파이 배열 모양 확인하는 방법

배열의 모양을 확인하는 방법은 shape()함수를 사용하여 확인합니다.

import numpy as np

arr = np.array([[11, 11, 9, 9],
                [11, 0, 2, 0]])

print(arr.shape)

a = np.array([[[1, 2, 3, 4],
               [5, 0, 2, 0]
               ],
              [[2, 3, 9, 2],
               [0, 1, 5, 6]]])

print(a.shape)

a = np.array([1, 2, 3])
print(a.shape)



#실행결과
(2, 4)
(2, 2, 4)
(3,)

 

numpy 배열의 요소(값)에 접근하기 위한 반복문 사용방법(iterate over Array)

넘파이 배열의 값을 확인하기 위해 반복문(for)을 사용하여 확인할 때, numpy.nditer()함수를 사용하여 어디까지 반복을 해야하는지 알 수 있습니다. 

import numpy as np
 
a = (np.arange(8)*2).reshape(2,4)
print(a,"n")

#배열의 모든 요소(elements)를 반복
for x in np.nditer(a):
	print(x, end=' ')
    
#실행결과
[[ 0  2  4  6]
 [ 8 10 12 14]] 

0 2 4 6 8 10 12 14 

 

numpy 배열의 최소값(min),  최대값(max) 얻는 방법

최대값은 numpy.max() 함수를 사용합니다.  최소값은 numpy.min()

import numpy as np

a = np.random.randint(20, size=(4, 5))
print(a)
b = np.max(a)
print(f'배열의 맥스값은 ? {b}')

b = np.min(a)
print(f'배열의 최소값은 ? {b}')


#실행결과
[[19 18  3 18 10]
 [11  8  9  0 12]
 [17  7 18 14  6]
 [ 8 14  6  6  9]]
 
배열의 맥스값은 ? 19
배열의 최소값은 ? 1

 

배열의 축(axis)를 따라 배열의 max값을 얻으려면 numpy.amax()함수를 사용합니다. axis 파라미터에 값을 적용합니다.

어느 축을 기준으로 하는지 정하는 거에요. 반대로 최소값은 numpy.amin()함수를 사용합니다. axis의 값은 0과 1만 가능합니다. 0은 수평방향(axis=0)을 의미하며, 1은 수직방향(axis=1)을 의미합니다.

import numpy as np

a = np.random.randint(10, size=(4, 5))
print(a, "n")

amax_value = np.amax(a, axis=0)
print(amax_value, "n")

amax_value = np.amax(a, axis=1)
print(amax_value, "n")
 
 
 
#실행결과
[[2 3 9 1 5]
 [0 4 1 1 0]
 [0 0 3 5 9]
 [4 0 3 9 5]] 

[4 4 9 9 9] 

[9 4 9 9] 

 

배열의 최소값 또는 최대값이 있는 위치를 구하려면, numpy.argmin(), numpy.argmax()함수를 사용합니다.

import numpy as np

a = np.random.randint(10, size=(4, 3))
print(a, "n")

b = np.argmax(a)
print(f'배열의 최대값의 위치는 ? {b}')

c = np.argmin(a)
print(f'배열의 최소값의 위치는 ? {c}')


b = np.argmax(a, axis=0)
print(f'배열의 최대값의 위치는 ? {b}')

c = np.argmin(a, axis=1)
print(f'배열의 최소값의 위치는 ? {c}')



#실행결과
[[0 6 8]
 [2 2 2]
 [4 4 7]
 [6 8 5]] 
 
배열의 최대값의 위치는 ? 2
배열의 최소값의 위치는 ? 0
배열의 최대값의 위치는 ? [3 3 0]
배열의 최소값의 위치는 ? [0 0 0 2]

 

여러 축에 따라 최대값을 찾으려면 axis 파라미터 값으로 튜플 자료형을 대입합니다.

import numpy as np

# 2D array => 2 axes
a = np.random.randint(9, size=(2, 2, 4))
print(a, "n")

b = np.amax(a, axis=(0, 2))
print('맥스값 axis=(0,2) : ')
print(b)

b = np.amax(a, axis=(0, 1))
print('맥스값 axis=(0,1) :')
print(b)


#실행결과
[[[2 1 7 0]
  [2 0 5 1]]

 [[0 4 1 1]
  [6 8 1 8]]] 

맥스값 axis=(0,2) : 
[7 8]
맥스값 axis=(0,1) :
[6 8 7 8]

 

numpy 배열의 합 구하기

numpy.sum()함수를 사용하여 배열의 합을 구합니다. 

import numpy as np

a = np.array([2, 6, 4, 5, 3, 7])
print(a)

b = np.sum(a)
print(f'배열의 총합? {b}')


#실행결과
[2 6 4 5 3 7]
배열의 총합? 27

 

numpy 배열의 가로 세로 축에 따른 합을 구하려면 axis인자를 사용합니다. axis=0인 경우는 세로를 기준으로 합계를 구하면, axis=1인 경우에는 가로를 기준으로 합계를 구합니다. 아래 예제코드를 보면 axis=0인 경우 합계를 계산하는 방법에 대해 풀이를 해보면  2+5 = 7, 6+3=9, 4+7=11 입니다.  axis=1인 경우에는 2+6+4 = 12, 5+3+7= 15입니다.

import numpy as np

a = np.array([2, 6, 4, 5, 3, 7]).reshape(2, 3)
print(a)

b = np.sum(a)
print(f'배열의 총합? {b}')

b = np.sum(a, axis=0)
print(f'naxis=0 축의 배열의 총합? {b}')

b = np.sum(a, axis=1)
print(f'naxis=1 축의 배열의 총합? {b}')



#실행결과
[[2 6 4]
 [5 3 7]]
배열의 총합? 27

axis=0 축의 배열의 총합? [ 7  9 11]

axis=1 축의 배열의 총합? [12 15]
[[6 9 9]

 

만약 배열의 합을 구할때 배열의 합에 기본적으로 더 해줄 초기값이 있다면 initial 파라미터에 값을 설정합니다. 디폴트 값은 0입니다. 아래 예제에서는 기본값으로 100을 주었기때문에 배열의 총합 27에 추가로 100을 더해주고 있습니다.

import numpy as np
a = np.array([2, 6, 4, 5, 3, 7])
b = np.sum(a, initial=100)
print(f'n배열의 총합? {b}')


#실행결과
배열의 총합? 127

 

numpy 배열의 모양을 변경하는 방법 

numpy.reshape()함수를 사용하여 다차원 배열로 재구성이 가능합니다. reshape()함수의 인자값은 튜플(tuple)자료형입니다. 다음 예제를 보면 1차원 배열을 2차원 배열로 변경하는 예제 입니다.

import numpy as np
a = np.array([2, 6, 4, 5, 3, 7]).reshape(2, 3)
print(a)
print(a[1][1])


#실행결과
[[2 6 4]
 [5 3 7]]
 
 3

 

reshape()함수를 사용하여 배열을 재구성할때, 기존 배열의 사이즈에 따라 변경할 수 있는데, 배열의 재구성이 불가능할 경우 ValueError: cannot reshape array of size 6 into shape (3,3) 와 같은 오류를 만나게 됩니다. 배열의 요소의 개수가 6개인데 하나의 배열당 3개의 요소를 갖는것으로 재구성하였음으로 오류가 발생합니다. 기존 배열에 값을 3개 더 추가해야 가능합니다.

import numpy as np

a = np.array([2, 6, 4, 5, 3, 7]).reshape(3, 3)
print(a) 

#실행결과
Traceback (most recent call last):
  File "C:pythonWorkspacemain.py", line 2, in <module>
    a = np.array([2, 6, 4, 5, 3, 7]).reshape(3, 3)
ValueError: cannot reshape array of size 6 into shape (3,3)



#1차원 배열에 요소 3개 추가 후 reshape(3, 3)으로 처리
a = np.array([2, 6, 4, 5, 3, 7, 9, 3, 2]).reshape(3, 3)
print(a)
print(a[1][1])


#실행결과
[[2 6 4]
 [5 3 7]
 [9 3 2]]
3

 

[REFERENCE]

ko.wikipedia.org/wiki/NumPy

pythonexamples.org/

numpy.org/doc/stable/reference/generated/numpy.linspace.html

jrcho.github.io/2018/01/20/Ch.3.Numpy.html

 

 

 

Leave a Reply

error: Content is protected !!