머신러닝을 위해 NumPy 배열을 인덱싱, 슬라이스 및 재구성하는 방법
머신러닝 데이터는 배열로 표시됩니다.
파이썬에서 데이터는 거의 보편적으로 NumPy 배열로 표현됩니다.
Python을 처음 사용하는 경우 네거티브 인덱싱 및 배열 슬라이싱과 같은 데이터에 액세스하는 몇 가지 Python 방법에 혼란스러울 수 있습니다.
이 자습서에서는 NumPy 배열(array)에서 데이터를 올바르게 조작하고 액세스하는 방법을 배웁니다.
이 자습서를 완료하면 다음을 알 수 있습니다.
- 목록 데이터를 NumPy 배열로 변환하는 방법.
- Pythonic 인덱싱 및 슬라이싱을 사용하여 데이터에 액세스하는 방법.
- 일부 머신러닝 API의 기대치를 충족하도록 데이터 크기를 조정하는 방법.
튜토리얼 개요
이 튜토리얼은 다음과 같이 네 부분으로 나뉩니다.
- 목록에서 배열로
- 배열 인덱싱
- 배열 슬라이싱
- 배열 재구성
1. 목록에서 배열로
일반적으로 Pandas 또는 NumPy 함수를 사용하여 파일에서 데이터를 로드하는 것이 좋습니다.
예를 들어 다음 게시물을 참조하십시오.
이 섹션에서는 다른 방법으로 데이터를 로드하거나 생성했으며 이제 Python 목록을 사용하여 표시되었다고 가정합니다.
목록의 데이터를 NumPy 배열로 변환하는 방법을 살펴보겠습니다.
배열에 대한 1차원 목록
데이터를 로드하거나 데이터를 생성하여 목록으로 액세스할 수 있습니다.
array() NumPy 함수를 호출하여 1차원 데이터 목록을 배열로 변환할 수 있습니다.
예제를 실행하면 1차원 목록이 NumPy 배열로 변환됩니다.
1 2 | [11 22 33 44 55] <class ‘numpy.ndarray’> |
배열할 목록의 2차원 목록
머신러닝에서는 2차원 데이터가 있을 가능성이 더 큽니다.
이는 각 행이 새 관측치를 나타내고 각 열이 새 피쳐를 나타내는 데이터 테이블입니다.
데이터를 생성했거나 사용자 지정 코드를 사용하여 로드하여 목록이 생겼을 수 있습니다. 각 목록은 새 관측치를 나타냅니다.
array()함수를 호출하여 위와 같은 방법으로 목록 목록을 NumPy 배열로 변환 할 수 있습니다.
예제를 실행하면 데이터가 성공적으로 변환된 것을 알 수 있습니다.
2. 배열 인덱싱
데이터가 NumPy 배열을 사용하여 표현되면 인덱싱을 사용하여 데이터에 액세스할 수 있습니다.
인덱싱을 통해 데이터에 액세스하는 몇 가지 예를 살펴보겠습니다.
1차원 인덱싱
일반적으로 인덱싱은 Java, C# 및 C++와 같은 다른 프로그래밍 언어에 대한 경험에서 기대하는 것처럼 작동합니다.
예를 들어, 검색할 값에 대한 0 오프셋 인덱스를 지정하는 대괄호 연산자 []를 사용하여 요소에 액세스할 수 있습니다.
예제를 실행하면 배열의 첫 번째 값과 마지막 값이 인쇄됩니다.
배열의 경계에 비해 너무 큰 정수를 지정하면 오류가 발생합니다.
예제를 실행하면 다음 오류가 출력됩니다.
한 가지 중요한 차이점은 음수 인덱스를 사용하여 배열 끝에서 오프셋된 값을 검색할 수 있다는 것입니다.
예를 들어 인덱스 -1은 배열의 마지막 항목을 나타냅니다. 인덱스 -2는 현재 예제의 첫 번째 항목에 대해 -5까지 두 번째 마지막 항목을 반환합니다.
예제를 실행하면 배열의 마지막 항목과 첫 번째 항목이 인쇄됩니다.
1 2 | 55 11 |
2차원 인덱싱
2차원 데이터 인덱싱은 각 차원의 인덱스를 구분하는 데 쉼표를 사용한다는 점을 제외하면 1차원 데이터를 인덱싱하는 것과 비슷합니다.
이는 각 차원에 대해 별도의 대괄호 연산자가 사용되는 C 기반 언어와 다릅니다.
예를 들어 다음과 같이 첫 번째 행과 첫 번째 열에 액세스 할 수 있습니다.
예제를 실행하면 데이터 집합의 첫 번째 항목이 인쇄됩니다.
첫 번째 행의 모든 항목에 관심이 있는 경우 다음과 같이 두 번째 차원 인덱스를 비워 둘 수 있습니다.
그러면 데이터의 첫 번째 행이 인쇄됩니다.
1 | [11 22] |
3. 어레이 슬라이싱
지금까지는 좋았습니다. 배열을 만들고 인덱싱하는 것은 익숙해 보입니다.
이제 배열 슬라이싱에 대해 설명했으며 이것은 Python 및 NumPy 배열 초보자에게 문제를 일으키는 기능 중 하나입니다.
목록 및 NumPy 배열과 같은 구조체를 슬라이스할 수 있습니다. 이는 구조체의 하위 시퀀스를 인덱싱하고 검색할 수 있음을 의미합니다.
이는 입력 변수와 출력 변수를 지정하거나 테스트 행에서 학습 행을 분할할 때 머신러닝에서 가장 유용합니다.
조각화는 콜론 연산자 ‘:’를 사용하여 열 앞뒤에 각각 ‘from‘ 및 ‘to‘ 인덱스를 사용하여 지정합니다. 조각은 ‘from’ 인덱스에서 확장되고 ‘to’ 인덱스 앞에서 한 항목을 끝냅니다.
몇 가지 예를 살펴보겠습니다.
1차원 슬라이싱
인덱스 없이 조각 ‘:’을 지정하여 배열 차원의 모든 데이터에 액세스할 수 있습니다.
예제를 실행하면 배열의 모든 요소가 인쇄됩니다.
배열의 첫 번째 항목은 인덱스 0에서 시작하여 인덱스 1(‘to’ 인덱스 앞의 한 항목)에서 끝나는 슬라이스를 지정하여 슬라이스할 수 있습니다.
예제를 실행하면 첫 번째 요소가 있는 하위 배열이 반환됩니다.
음수 인덱스를 조각으로 사용할 수도 있습니다. 예를 들어 슬라이스를 -2(두 번째 마지막 항목)에서 시작하고 ‘to’ 인덱스를 지정하지 않음으로써 목록의 마지막 두 항목을 슬라이스할 수 있습니다. 그러면 슬라이스가 차원의 끝으로 이동합니다.
예제를 실행하면 마지막 두 항목만 있는 하위 배열이 반환됩니다.
2차원 슬라이싱
머신러닝에서 가장 많이 사용할 가능성이 높은 2차원 조각화의 두 가지 예를 살펴보겠습니다.
입력 및 출력 기능 분할
로드된 데이터를 입력 변수(X)와 출력 변수(y)로 분할하는 것이 일반적입니다.
모든 행과 모든 열을 마지막 열 앞까지 슬라이스 한 다음 마지막 열을 별도로 인덱싱하여 이를 수행 할 수 있습니다.
입력 기능의 경우 행 인덱스에 ‘:’를 지정하고 열 인덱스에 :-1을 지정하여 마지막 행을 제외한 모든 행과 모든 열을 선택할 수 있습니다.
출력 열의 경우 ‘:’를 사용하여 모든 행을 다시 선택하고 -1 인덱스를 지정하여 마지막 열만 인덱싱할 수 있습니다.
이 모든 것을 종합하면 다음과 같이 3열 2D 데이터 세트를 입력 데이터와 출력 데이터로 분리할 수 있습니다.
예제를 실행하면 분리된 X 및 y 요소가 인쇄됩니다. X는 2차원 배열이고 y는 1차원 배열입니다.
기차 열과 테스트 행 분할
로드된 데이터 세트를 별도의 학습 집합과 테스트 집합으로 분할하는 것이 일반적입니다.
일부 부분은 모델을 학습하는 데 사용되고 나머지 부분은 학습된 모델의 기술을 예측하는 데 사용되는 행의 분할입니다.
여기에는 두 번째 차원 인덱스에 ‘:’를 지정하여 모든 열을 조각화하는 작업이 포함됩니다. 학습 데이터 세트는 처음부터 분할 지점까지의 모든 행입니다.
테스트 데이터 집합은 분할 지점에서 차원의 끝까지 모든 행입니다.
이 모든 것을 합치면 인위적인 분할점 2에서 데이터 세트를 분할할 수 있습니다.
예제를 실행하면 학습할 처음 두 행과 테스트 세트의 마지막 행이 선택됩니다.
4. 배열 재구성
데이터를 조각화한 후 재구성해야 할 수 있습니다.
예를 들어 scikit-learn과 같은 일부 라이브러리에서는 출력 변수(y)의 1차원 배열을 각 행에 대한 하나의 열과 결과가 있는 2차원 배열로 구성해야 할 수 있습니다.
Keras의 장단기 기억 순환 신경망과 같은 일부 알고리즘에서는 입력값을 샘플, 타임스텝 및 특징으로 구성된 3차원 배열로 지정해야 합니다.
데이터가 특정 Python 라이브러리의 기대치를 충족하도록 NumPy 배열의 모양을 변경하는 방법을 아는 것이 중요합니다. 이 두 가지 예를 살펴보겠습니다.
데이터 셰이프
NumPy 배열에는 배열의 각 차원 길이의 튜플을 반환하는 모양 특성이 있습니다.
예를 들어:
예제를 실행하면 1차원에 대한 튜플이 인쇄됩니다.
길이가 두 개인 튜플이 2차원 배열에 대해 반환됩니다.
예제를 실행하면 행과 열의 개수가 포함된 튜플이 반환됩니다.
배열 차원의 크기를 shape 차원에서 사용할 수 있습니다(예: 매개 변수 지정).
튜플의 요소는 배열처럼 액세스 할 수 있으며 행 수에 대한 0 번째 인덱스와 열 수에 대한 1st 인덱스가 있습니다. 예를 들어:
예제를 실행하면 각 차원의 특정 크기에 액세스합니다.
1D를 2D 배열로 재구성
1차원 배열을 하나의 열과 여러 행이 있는 2차원 배열로 모양을 변경해야 하는 것이 일반적입니다.
NumPy는 데이터의 모양을 바꾸는 데 사용할 수 있는 NumPy 배열 객체에 대해 reshape() 함수를 제공합니다.
reshape()함수는 배열의 새 모양을 지정하는 단일 인수를 사용합니다. 1차원 배열을 하나의 열이 있는 2차원 배열로 재구성하는 경우 튜플은 배열의 모양이 첫 번째 차원(data.shape[0])이고 두 번째 차원의 경우 1이 됩니다.
이 모든 것을 종합하면 다음과 같은 작업 예제를 얻을 수 있습니다.
예제를 실행하면 1차원 배열의 모양이 인쇄되고 배열의 모양이 1개의 열로 5개 행으로 변경된 다음 이 새 모양이 인쇄됩니다.
2D를 3D 배열로 재구성
각 행이 시퀀스를 나타내는 2차원 데이터를 하나 이상의 시간 스텝과 하나 이상의 특징의 여러 샘플을 예상하는 알고리즘에 대해 3차원 배열로 재구성해야 하는 것이 일반적입니다.
좋은 예는 Keras 딥 러닝 라이브러리의 LSTM 순환 신경망 모델입니다.
reshape 함수는 새 차원을 지정하여 직접 사용할 수 있습니다. 이는 각 시퀀스에 각 시간 스텝에서 하나의 관찰(특징)이 있는 여러 시간 스텝이 있는 예에서 명확합니다.
배열의 shape 속성에있는 크기를 사용하여 샘플 (행)과 열 (시간 단계)의 수를 지정하고 기능 수를 1로 고정 할 수 있습니다.
이 모든 것을 종합하면 다음과 같은 작업 예제를 얻을 수 있습니다.
예제를 실행하면 먼저 2D 배열의 각 차원 크기가 인쇄되고 배열의 모양이 변경된 다음 새 3D 배열의 모양이 요약됩니다.
1 2 | (3, 2) (3, 2, 1) |
추가 정보
이 섹션에서는 더 자세히 알아보려는 경우 주제에 대한 더 많은 리소스를 제공합니다.
요약
이 자습서에서는 Python을 사용하여 NumPy 배열의 데이터에 액세스하고 모양을 변경하는 방법을 발견했습니다.
특히 다음 내용을 배웠습니다.
- 목록 데이터를 NumPy 배열로 변환하는 방법.
- Pythonic 인덱싱 및 슬라이싱을 사용하여 데이터에 액세스하는 방법.
- 일부 머신러닝 API의 기대치를 충족하도록 데이터 크기를 조정하는 방법.