NumPy 배열: 소개 [예제 포함]
게시 됨: 2022-12-08NumPy를 시작하려고 하시나요? 이 가이드는 Python에서 NumPy 배열의 기본 사항을 알려줍니다.
첫 번째 단계로 NumPy 배열이 Python 목록과 어떻게 다르게 작동하는지 배우게 됩니다. 그런 다음 NumPy 배열을 만들고 기본 작업을 수행하는 여러 가지 방법을 배웁니다.
의 시작하자!
NumPy 배열의 기초
NumPy는 과학 컴퓨팅 및 데이터 분석을 위한 가장 인기 있는 Python 라이브러리 중 하나입니다. NumPy의 기본 데이터 구조는 N차원 배열(ND 배열)입니다. 브로드캐스팅 기능이 있으며 속도를 위해 작업을 벡터화 하고 성능 향상을 위해 내장된 수학 함수를 사용할 수 있습니다.
NumPy 작업을 시작하려면 먼저 라이브러리를 설치하고 작업 환경으로 가져와야 합니다. pip를 통해 설치할 수 있는 PyPI 패키지로 제공됩니다.
NumPy를 설치하려면 터미널을 열고 다음 명령을 실행하십시오.
pip3 install numpy
NumPy를 설치한 후 별칭으로 작업 환경으로 가져올 수 있습니다. 일반적인 별칭은 np
입니다.
import numpy as np
참고 : 별칭
np
로 NumPy를 가져오는 것은 필수 사항이 아니라 권장 규칙입니다.
Python 목록 대 NumPy 배열
다음 Python 숫자 목록을 고려하십시오.
py_list = [1,2,3,4]
목록을 인수로 사용하여 np.array()
함수를 호출하여 기존 목록에서 NumPy 배열을 가져올 수 있습니다.
np_arr1 = np.array(py_list) print(np_arr1) [1 2 3 4]
np_arr1
의 유형을 확인하기 위해 내장 type()
함수를 호출하면 NumPy의 기본 데이터 구조인 ndarray
임을 알 수 있습니다.
type(np_arr1) # numpy.ndarray
Python 목록과 NumPy 배열이 비슷해 보일 수 있지만 몇 가지 차이점이 있습니다.
- Python 목록은 다양한 데이터 유형의 개체를 보유할 수 있는 반면 NumPy 배열에는 동일한 데이터 유형의 요소가 포함됩니다. 기본 데이터 유형은 정밀도가 64비트(float64)인 float입니다.
- Python 목록의 요소가 반드시 메모리의 연속 위치에 저장되는 것은 아닙니다. 그러나 NumPy 배열의 요소는 메모리의 연속 블록에 저장됩니다. 결과적으로 요소를 조회하고 액세스하는 것이 더 빠릅니다.
몇 가지 다른 차이점을 살펴보겠습니다.
방송
NumPy 어레이의 강력한 기능은 브로드캐스팅입니다. np_arr1
및 py_list
의 모든 요소에 2를 추가하고 싶다고 가정합니다.
py_list
에 2를 추가하고 무슨 일이 일어나는지 봅시다:
>>> py_list + 2
두 개의 목록만 연결할 수 있고 이와 같이 py_list + 2를 추가하는 것은 지원되지 않는다는 TypeError가 발생하는 것을 볼 수 있습니다.
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-c0f9974899df> in <module> ----> 1 py_list + 2 TypeError: can only concatenate list (not "int") to list
배열 np_arr1
에서 동일한 작업을 시도해 봅시다.
>>> np_arr1 + 2
결과에서 배열의 각 요소에 2가 추가된 것을 볼 수 있습니다.
array([3, 4, 5, 6])
이는 NumPy가 이 결과를 산출하기 위해 스칼라 2를 호환되는 모양의 배열로 암시적으로 브로드캐스팅했기 때문입니다.
벡터화
NumPy 배열은 더 빠른 요소별 작업을 위해 벡터화를 지원합니다. 두 배열의 요소별 합계를 찾고 싶다고 가정합니다.
목록에서 간단한 +
연산을 사용하면 두 목록의 연결이 반환됩니다(원하는 바가 아닙니다!).
>>> py_list + py_list # [1, 2, 3, 4, 1, 2, 3, 4]
그러나 NumPy 배열 np_arr1
에 대한 동일한 작업은 np_arr1
의 요소별 합계를 자체와 함께 반환합니다.
>>> np_arr1 + np_arr1 # array([2, 4, 6, 8])
마찬가지로 중첩된 목록은 N차원 NumPy 배열과 구조가 비슷해 보일 수 있습니다. 그러나 지금까지 논의된 차이점은 유지됩니다.
nested_list = [[1,2],[3,4],[5,6]] np_arr2 = np.array(nested_list) print(np_arr2)
[[1 2] [3 4] [5 6]]
NumPy 배열을 만드는 방법
np.array(list-obj)
를 사용하여 기존 Python 목록에서 항상 NumPy 배열을 만들 수 있습니다. 그러나 이것은 가장 효율적인 방법이 아닙니다.
대신 특정 모양의 배열을 만들 수 있는 여러 내장 함수를 사용할 수 있습니다. 배열의 모양은 각 차원을 따라 배열의 크기를 나타내는 튜플입니다. 예를 들어, 2개의 행과 2개의 열이 있는 2×2 배열의 모양은 (2,2)입니다. 이 섹션에서는 이러한 내장 함수 중 일부를 사용하는 방법을 배웁니다.
0과 1의 배열 만들기
모두 0 또는 모두 1로 채워진 특정 차원의 배열을 만드는 것이 종종 도움이 됩니다. 그런 다음 프로그램의 후속 단계에서 이를 사용하고 수정합니다.
zeros()
함수를 사용하여 0의 배열을 만들 수 있습니다. 필요한 배열의 모양을 튜플 np.zeros(shape)
로 전달합니다.
array0 = np.zeros((3,3)) print(array0)
다음은 0의 2D 배열인 출력입니다.
[[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]]
아래와 같이 점 표기법을 사용하여 NumPy 배열의 속성에 액세스하고 dtype
및 shape
와 같은 속성을 호출할 수 있습니다.
print(array0.dtype) # float64 print(array0.shape) # (3, 3)
1의 배열을 얻으려면 np.ones()
함수를 사용할 수 있습니다.
array1 = np.ones((3,3)) print(array1)
[[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]
항등 행렬 만들기
항등 행렬은 선형 대수학의 여러 응용 프로그램에서 널리 사용됩니다. 그리고 np.eye()
함수를 사용하여 항등 행렬을 만들 수 있습니다. np.eye()
함수는 행렬의 차수( n
)라는 하나의 인수만 받습니다.
arrayi = np.eye(3) print(arrayi)
[[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
난수 배열 만들기
특정 분포에서 추출한 난수로 채워진 특정 모양의 배열을 만들 수도 있습니다. 일반적으로 사용되는 확률 분포는 균일 분포와 표준 정규 분포입니다.
NumPy의 random
모듈의 일부인 randn()
함수는 표준 정규 분포 에서 샘플링된 숫자 배열을 생성하는 데 사용할 수 있습니다. 표준 정규 분포는 평균이 0이고 분산이 단위인 가우시안 분포입니다.
std_arr = np.random.randn(3,4) print(std_arr)
[[-0.13604072 1.21884359 2.06850932 0.78212093] [ 0.44314719 -0.78084801 -0.70517138 1.17984949] [ 1.13214829 1.02339351 0.15317809 1.83191128]]
np.random.rand()
는 간격 [0,1)에 걸쳐 균등 분포 에서 샘플링된 숫자 배열을 반환합니다.
uniform_arr = np.random.rand(2,3) print(uniform_arr)
[[0.90470384 0.18877441 0.10021817] [0.741 0.10657658 0.71334643]]
NumPy의 random 모듈의 일부인 randint()
함수를 사용하여 임의의 정수 배열을 만들 수도 있습니다. np.random.randint(low, high, size)
는 정수 배열을 반환합니다. 배열의 모양은 size
인수에서 유추되며 정수는 [low,high)
간격의 값을 갖습니다.
예를 들면 다음과 같습니다.
int_arr = np.random.randint(1,100,(2,3)) print(int_arr)
[[53 89 33] [24 85 33]]
기타 유용한 내장 기능
다음으로 NumPy 배열을 만드는 데 유용한 몇 가지 다른 기능을 살펴보겠습니다.
arange()
함수는 step
값의 단계에서 start
값과 stop
값 사이의 숫자 배열을 반환합니다: start
, start + step
, start + 2*step
up to but not include stop
. start
및 step
값은 선택 사항 입니다. 기본 단계 크기는 1이고 기본 시작 값은 0입니다.
이 예에서 array_a
는 1에서 시작하여 0.5단계로 10을 포함하지 않는 숫자 배열입니다.
array_a = np.arange(1,10,0.5) print(array_a)
[1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5]
np.linspace()
를 사용하여 균일한 간격의 숫자 배열을 만들 수도 있습니다. np.linspace(start, stop, num)
를 사용하여 start
값과 stop
값 사이에 균일한 간격의 num
배열을 가져옵니다.
여기서 arr_lin
은 간격 [1,10]에서 균일한 간격으로 배열된 5개의 숫자 배열입니다.
array_lin = np.linspace(1,10,5) print(array_lin)
[ 1. 3.25 5.5 7.75 10. ]
유사하게, arr_lin2
는 간격 [1,20]에서 균일한 간격으로 배열된 10개의 숫자 배열입니다.
array_lin2 = np.linspace(1,20,10) print(array_lin2)
[ 1. 3.11111111 5.22222222 7.33333333 9.44444444 11.55555556 13.66666667 15.77777778 17.88888889 20. ]
arange( arange()
함수와 달리 linspace()
함수는 기본적으로 끝점을 포함 합니다.
NumPy 어레이의 기본 작업
다음으로 NumPy 배열에 대한 몇 가지 기본 작업을 살펴보겠습니다.
최소 및 최대 요소 찾기
NumPy의 random 모듈에서 함수를 사용하여 배열을 만들 때마다 코드가 실행될 때마다 다른 결과를 얻게 됩니다. 재현 가능한 결과를 얻으려면 시드를 설정해야 합니다: np.random.seed(seed_value)
.
다음 예에서 재현성을 위해 시드를 설정했습니다. int_arr1
은 간격 [1,100)에 있는 7개의 임의 정수 배열입니다.
np.random.seed(27) int_arr1 = np.random.randint(1,100,7) print(int_arr1) # [20 57 73 32 57 38 25]
- 배열에서 최대 요소를 찾으려면 배열 개체
int_arr1
에서max()
메서드를 호출하고 - 배열에서 최소 요소를 찾기 위해 배열 객체
int_arr1
에서min()
메서드를 호출할 수 있습니다.
int_arr1.max() # 73 int_arr1.min() # 20
최대 및 최소 요소의 인덱스 찾기
경우에 따라 최대 및 최소 요소의 인덱스를 찾아야 할 수도 있습니다. 이를 위해 배열 객체에서 argmax()
및 argmin()
메서드를 호출할 수 있습니다.
여기서 최대 요소 73은 인덱스 2에서 발생합니다.
int_arr1.argmax() # 2
그리고 최소 요소 20은 인덱스 0에서 발생합니다.
int_arr1.argmin() # 0
np.argmax(array)
및np.argmin(array)
을 사용하여 각각 최대 및 최소 요소의 인덱스를 찾을 수도 있습니다. NumPyargmax()
함수에 대해 자세히 알아보세요.
NumPy 배열을 연결하는 방법
NumPy 배열로 수행할 수 있는 또 다른 일반적인 작업은 연결입니다.
vstack을 사용한 세로 연결
vstack()
함수를 사용하여 배열을 세로로 연결할 수 있습니다.
다음은 예입니다. arr1
은 2행 3열로 구성된 1의 배열이고 arr2
는 0으로 2행 3열로 구성된 배열입니다.
arr1 = np.ones((2,3)) arr2 = np.zeros((2,3))
다음과 같이 vstack()
함수를 사용하여 이 두 배열을 세로로 연결할 수 있습니다.
np.vstack((arr1,arr2))
array([[1., 1., 1.], [1., 1., 1.], [0., 0., 0.], [0., 0., 0.]])
스택이 수직으로 발생하므로 두 어레이의 열 수가 같아야 합니다.
arr2
를 모양(2,2)으로 변경해 봅시다. 이제 두 개의 행과 두 개의 열이 있습니다.
arr1 = np.ones((2,3)) arr2 = np.zeros((2,2)) np.vstack((arr1,arr2))
따라서 세로 연결이 불가능하고 ValueError가 발생합니다.
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-21-d5d3bf37fc21> in <module> ----> 1 np.vstack((arr1,arr2)) ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 3 and the array at index 1 has size 2
hstack을 사용한 가로 연결
아래와 같이 hstack()
함수를 사용하여 NumPy 배열을 가로로 연결할 수 있습니다.
arr1 = np.ones((3,3)) arr2 = np.zeros((3,2))
np.hstack((arr1,arr2))
스태킹이 수평으로 발생하기 때문에 입력 배열은 동일한 수의 행 을 가져야 합니다. 여기서 arr1
과 arr2
에는 모두 세 개의 행이 있습니다.
array([[1., 1., 1., 0., 0.], [1., 1., 1., 0., 0.], [1., 1., 1., 0., 0.]])
연결 사용
concatenate()
함수를 사용하여 특정 축을 따라 NumPy 배열을 연결할 수도 있습니다. 선택적 axis
인수를 연결하려는 축으로 설정하십시오. 축의 기본값 은 0입니다.
다음은 몇 가지 예입니다.
arr1 = np.ones((2,3)) arr2 = np.zeros((2,3))
연결할 축을 지정하지 않으면 배열이 축 0을 따라 연결됩니다. 결과 배열에서 두 번째 배열 arr2
가 첫 번째 배열 아래에 추가됩니다(행으로).
np.concatenate((arr1,arr2))
array([[1., 1., 1.], [1., 1., 1.], [0., 0., 0.], [0., 0., 0.]])
axis = 1
지정하면 다음 결과를 얻습니다. arr2
는 첫 번째 배열인 arr1
옆에 (열로) 연결됩니다.
np.concatenate((arr1,arr2),axis=1)
array([[1., 1., 1., 0., 0., 0.], [1., 1., 1., 0., 0., 0.]])
hstack()
및 vstack()
함수 와 마찬가지로 연결 축을 따라 배열의 크기가 일치해야 합니다 .
결론
이 자습서에서는 NumPy 배열과 Python 목록의 차이점을 배웠으며 속도와 효율성 측면에서 N차원 배열의 이점에 중점을 두었습니다.
또한 특정 차원의 배열을 만들고 최소 및 최대 요소 찾기, 배열 연결 등과 같은 일반적인 작업을 수행하는 몇 가지 유용한 함수를 배웠습니다.
다음으로 NumPy 배열을 재구성하는 방법을 배웁니다.