프로그래밍/데이터사이언스

[Python] 데이터사이언스를 위한 NumPy - (1) 배열 생성

Churnobyl 2023. 5. 17. 16:53
728x90
반응형

 

Numpy Array

 NumPy(Numerical Python)는 수치해석과 통계를 위한 오픈 소스 파이썬 라이브러리로 단독적으로 쓰이기도 하지만 보통 Scipy, Pandas, matplotlib과 같은 과학이나 수학 관련 패키지에서 광범위하게 사용된다. 원래 파이썬은 수치해석이나 통계같은 복잡한 계산을 하기 위한 언어가 아니었지만 numpy가 이런 점을 보완시켰다. 상당 부분 C언어와 포틀란으로 작성돼 있어 속도도 빠른 편이다.

 NumPy는 배열을 계산하기 위해 ndarray(n차원 array)라는 객체를 제공하는데, ndarray객체를 이용해서 수학의 행렬 연산과 유사한 연산을 수행할 수 있다.

 

 


NumPy 설치하기

pip install numpy

넘파이는 위의 명령어로 간단히 설치할 수 있다. 리눅스 기반으로 만들어진 google colab을 쓰고 있다면 앞에 !을 붙여주고 셀을 실행시켜주면 된다. 기본적으로 깔려있긴 하다

 


NumPy array 생성

numPy array를 생성하는 방법은 6가지가 있다

  1. Python List나 Tuple같은 시퀀스에서 변환
  2. NumPy에서 제공하는 배열 생성 함수
  3. 기존 배열 복제, 결합, 변형
  4. 파일로부터 읽기
  5. 문자열이나 버퍼로 된 바이트 형식으로부터 만들기
  6. SciPy, Pandas, OpenCV 등의 특수 라이브러리 기능 가용

 

 


1. Python 시퀀스에서 변환

 

Python List나 Tuple로 ndarray를 생성할 수 있다.

아래의 간단한 케이스들을 보자.

import numpy as np

# 1
arr = np.array([1, 2, 3, 4])
print(arr)
print(type(arr))

# 2
arr2 = np.array([(1, 2), (3, 4)])
print(arr2)
print(type(arr2))

# 3
arr3 = np.array((((1, 2), (3, 4)), ((5, 6), (7, 8))))
print(arr3)
print(type(arr3))

# 4
wrong_dtype_arr = np.array([127, 128, 129], dtype=np.int8)
print(wrong_dtype_arr)
print(type(wrong_dtype_arr))
# 1
[1 2 3 4]
<class 'numpy.ndarray'>

# 2
[[1 2]
 [3 4]]
<class 'numpy.ndarray'>

# 3
[[[1 2]
  [3 4]]
 [[5 6]
  [7 8]]]
<class 'numpy.ndarray'>

# 4
DeprecationWarning: NumPy will stop allowing conversion of out-of-bound Python integers to integer arrays.
[ 127 -128 -127]
<class 'numpy.ndarray'>

# 1

파이썬 리스트를 활용해 ndarray 객체를 만들었다

 

# 2

튜플도 시퀀스 객체이므로 문제없이 2차원 ndarray객체로 변환됐다

 

# 3

중첩된 튜플을 이용해 3차원 ndarray객체를 만들었다

 

# 4

numPy는 C 및 C++로 만들어졌기 때문에 ndarray객체를 만들 때 dtype 즉, data type을 명시해주는 것이 중요하다. 위의 예제에서 np.int8은 -128~127까지의 숫자를 표시할 수 있으므로 범위 이상의 파이썬 정수를 정수 ndarray로 바꾸는 걸 허용하는 것 자체가 사라질 것이라는 경고와 함께 128, 129가 각각 음수를 붙인 -128, -127로 변환됐다. dtype을 제대로 명시하지 않으면 작업이 전체적으로 틀어질 수 있기 때문에 dtype을 정확히 명시하도록 하자.

 

 

 


2. Numpy 제공 함수들

NumPy에는 배열을 생성하기 위한 40개 이상의 내장함수가 있다. 여기

크게 1차원 배열, 2차원 배열, n차원 배열(ndarrays)로 나눌 수 있는데 각각 알아보자

 

 

1. 1D array

  • numpy.full(shape, fill_value[, dtype, order, like])

주어진 shape와 dtype으로 fill_value를 채운 1차원 배열을 리턴한다

import numpy as np

# 1
arr = np.full(10, 5, dtype=np.int8)
print(arr)
[5 5 5 5 5 5 5 5 5 5]

# 1

5를 10개 생성한 1차원 배열

 

 

  • numpy.arange([start,]stop[, step,][, dtype, like])

연속된 값들로 이루어진 배열을 리턴한다. 매개변수가 복잡해 보이지만 파이썬의 range와 비슷한 방식으로 동작하므로 어렵지 않다. 파라미터가 각각 1개, 2개, 3개일 때를 구분해서 알아보자

import numpy as np

# 1
arr = np.arange(6)
print(arr)

# 2
arr2 = np.arange(2, 7)
print(arr2)

# 3
arr3 = np.arange(2, 10, 3)
print(arr3)
# 1
[0 1 2 3 4 5]

# 2
[2 3 4 5 6]

# 3
[2 5 8]

# 1

0부터 시작해 6개의 값으로 된 배열이 리턴됐다

 

# 2

파이썬의 range와 같은 방식으로 2부터 시작해 stop인 7을 포함하지 않은 배열이 리턴됐다

 

# 3

2부터 시작해 3의 일정한 간격의 값이 담긴 배열이 리턴됐다

 

 

  • numpy.linspace(start, stop[, num=50, endpoint])

주어진 start, stop 범위내에서 균등하게 나뉜 값으로 된 배열을 리턴한다.

import numpy as np

# 1
arr = np.linspace(2, 3)
print(arr)

# 2
arr2 = np.linspace(2, 10, 5)
print(arr2)
[2. 2.02040816 2.04081633 ...(45개)... 2.97959184 3. ]
[ 2. 4. 6. 8. 10.]

# 1

num을 지정해주지 않으면 num의 기본값이 50이므로 2와 3사이 균등하게 나눠진 50개의 값으로 이루어진 배열이 리턴됐다.

 

# 2

2와 10 사이에 5개의 값이 리턴됐다. 세개의 매개변수를 갖는 건 arange와 같지만 다른 점은 arange는 start와 end사이 step간격으로 출력하는 것이고, linspace는 start와 end사이 num개의 값을 출력하는 것이다.

 

 

2. 2D array

 

  • numpy.eye(N[, M, k, dtype, order, subok])

i=j는 1, 나머지는 0로 된 2차원 배열을 리턴한다

import numpy as np

# 1
arr = np.eye(4)
print(arr)

# 2
arr2 = np.eye(3, 5)
print(arr2)

# 3
arr3 = np.eye(5, 3)
print(arr3)
# 1
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

# 2
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]]

# 3
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [0. 0. 0.]
 [0. 0. 0.]]

# 1

매개변수가 1개일 때 행 4, 열 4의 단위행렬이 출력됐다.

단위행렬을 생성하는 numpy.identity(4)와 같다.

 

# 2

매개변수가 2개일 때 행 3, 열 5인 배열이 출력됐으며 i=j인 요소는 1로, 나머지는 0이다.

 

# 3

반대로 행 5, 열 3인 배열이 출력됐다.

 

 

  • numpy.diag(v[, k])

대각선을 따라 주어진 값을 가진 정사각형 2차원 배열을 정의하거나 2차원 배열로부터 대각선의 1차원 요소를 리턴할 수 있다.

import numpy as np

# 1
arr = np.diag([1, 2, 3, 4])
print(arr)

# 2
arr2 = np.diag([1, 2, 3, 4], 2)
print(arr2)

# 3
arr3 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.diag(arr3))
# 1
[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]

# 2
[[0 0 1 0 0 0]
 [0 0 0 2 0 0]
 [0 0 0 0 3 0]
 [0 0 0 0 0 4]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]]

# 3
[1 5 9]

# 1

대각선이(i=j인) 리스트의 값으로 채워진 2차원 배열이 리턴됐다

 

# 2

2개의 열이 먼저 0으로 채워진 뒤 대각선이 리스트의 값으로 채워진 2차원 배열이 리턴됐다

 

# 3

2차원 배열을 넣었을 때 대각선의 값들이 1차원 배열로 출력됐다.

 

 

3. 일반 ndarray 생성

 

  • numpy.zeros(shape[, dtype, order, like])

주어진 shape만큼 0을 채운 1차원 배열을 리턴한다

import numpy as np

# 1
arr = np.zeros(5, dtype=int)
print(arr)
[0 0 0 0 0]

# 1

0을 5개 생성한 1차원 배열

 

 

  • numpy.ones(shape[, dtype, order, like])

zeros와 비슷하게 주어진 shape만큼 1을 채운 1차원 배열을 리턴한다

import numpy as np

# 1
arr = np.ones(12, dtype=float)
print(arr)
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

# 1

1을 12개 생성한 1차원 배열

 

 

  • numpy.random.random([size])

0~1 사이의 랜덤한 float타입 값을 size만큼 채운 1차원 배열을 리턴한다

import numpy as np

# 1
value = np.random.random()
print(value)
print(type(value))

# 2
arr = np.random.random(5)
print(arr)
# 1
0.07493993311298375
<class 'float'>

# 2
[0.50994561 0.01144047 0.48165858 0.59950528 0.5753257 ]

# 1

매개변수를 넘겨주지 않으면 float타입 값을 넘겨준다

 

# 2

0~1 사이의 랜덤한 5개의 값으로 된 배열이 리턴됐다.

 

반응형