달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

인덱싱과 슬라이싱은 NumPY에서 데이터를 다루는 중요한 부분 중에 하나이다.

 

Python의 List와 유사하게 NumPY ndarray도 슬라이싱을 할 수 있는데 다차원인 경우가 많기 때문에 각 차원별로 어떻게 슬라이스할건지 명확히 해야한다. NumPY ndarray를 슬라이싱하면 결과로 얻어지는 배열은 언제나 원본 배열의 부분 배열이다.

 

  • NumPY slicing?   

      연속된 객체 범위를 지정 선택해서 객체들을 가져오는 방법으로 슬라이싱을 하면 새로운 객체를 생성하게 된다. 원본 배열의 일부분을 복사해서 가져오지만 새로운 배열이 아니라 레퍼런스이다.

 

기본형태 : array_name[start:end:step]

각각 start, end, step은 양수와 음수를 가질 수 있다.

start: 슬라이싱을 시작할 위치로 start를 기술하지 않으면 0을 나타낸다.

end: 슬라이싱을 끝낼 위치로 end를 포함하지 않는다. 즉 end-1을 나타낸다. end를 기술하지 않으면 끝을 나타낸다.

step: stride라고도 하며 몇개씩 끊어서 가져올지를 정한다. 옵션으로 삭제할 수도 있다.

start:end:step은 ','를 이용해서 슬라이싱할 수 있다.

array_name[행 슬라이싱 시작:행 슬라이싱 끝, 열 슬라이싱 시작:열 슬라이싱 끝]

 

 

ndarray에서 인덱스 값들의 위치

양수: 연속적인 객체들의 제일 앞에서부터 0을 시작으로 함

음수: 연속적인 객체들의 제일 뒤에서부터 -1을 시작으로 함

ex_array[a,b,c,d,e]

양수의 경우 a, b, c, d, e는 순서대로 0, 1, 2, 3, 4 양수의 인덱스 값을 같고

음수의 경우 a, b, c, d, e는 순서대로 -5, -4, -3 ,-2, -1 음수의 인덱스 값을 같는다

 

원본 ndarray와 slicing된 ndarray의 관계

 

slicing된 ndarray 값 변경 후 원본 확인

 

 

행과 열 slicing의 예

 

행과 열 slicing의 결과

 

 

  • NumPY 인덱싱

 

슬라이싱이 자르는 것이라면 인덱싱은 선택을 해서 가져오는 것이다. 인덱싱을 통해서 원소에 접근할 수 있다.

인덱싱은 아래 두 가지 방법으로 접근할 수 있다.

 

  • a[0,0] //python에서 선호하는 방법, python에서는 이 방법을 사용하자.
  • a[0][0] //C++ style

 

ndarray를 인덱싱하면 연속하지 않은 값을 가져올 수 있기 때문에 원본과 다른 배열을 만들 수 있다.

 

인덱싱 예

 

인덱싱 결과

 

  • 인덱싱과 슬라이싱의 차원

 

인덱싱과 슬라이싱을 혼합해서 사용하면 낮은 차원의 배열이 생성된다.

슬라이싱은 원본의 데이타를 그대로 가져오는 레퍼러스이기 때문에 원본과 동일한 차원의 배열이 생성된다.

인덱싱은 원본에서 새로운 배열을 가져오는 것이기 때문에 원본보다 낮은 차원의 배열이 생성될 수 있다.

인덱싱을 하면은 해당 인덱싱 값만 가져오기 때문이다. 다차원 배열의 연산을 할 때는 차원이 같아야 한다. 

다차원 배열에서는 차원이 달라 연산 시 문제가 될 때가 있다. 특별히 인덱싱을 써야하는 상황이 아니라면 슬라이싱으 추천한다.

 

인덱스와 슬라이싱의 차원

 

결과

 

  • 불리언 배열 인덱싱

 

불리언 배열 인덱싱을 통해 배열 속 요소를 취사선택할 수 있다. 불리언 배열 인덱싱은 특정 조건을 만족하게 하는 요소만 선택하고자 할 때 자주 사용된다.

불리언 인덱싱

 

불리언 인덱싱

 

불리언 인덱싱은 다차원 배열에서 데이터를 필터링 할 때 많이 쓴다. 특정 조건을 만족하는 요소를 선택하고자 할 때 사용한다.

 

 

  • 정수 배열 인덱싱

정수 배열 인덱싱

 

정수 배열 인덱싱 결과

 

 

  • 전치(transpose)

전치는 모양(stride)을 바꾸는 기능을 한다. 종종 배열의 모양을 바꾸어 데이터를 처리할 때가 있다. 가장 간단한 예는 행렬의 주 대각선을 기준으로 대칭되는 요소끼리 뒤바뀌는 것이다.

행렬을 전치하기 위해서는 간단하게 배열 객체의 'T' 속성을 사용하면 된다. 1차원일 경우 대각선이 없기 때문에 전치를 해도 아무런 변화가 없다.

데이터 분석할 때 많이 사용하지는 않지만 머신러닝의 알고리즘을 구현할 때는 많이 사용한다.

 

전치

 

전치 결과

 

 

  • Shape변경

 

shape 변경에는 크게 세가지 메서드를 볼 것이다.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html?highlight=reshape

resahape 메서드는 다차원 배열 데이타의 값 변화 없이 shape의 형태만 바꾸는 메서드이다.

 

numpy.reshape — NumPy v1.16 Manual

Parameters: a : array_like Array to be reshaped. newshape : int or tuple of ints The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length. One shape dimension can be -1. In this case, the

docs.scipy.org

 

reshape

 

reshape 결과

 

 

ravel을 다차원 배열을 직선,  1차원으로 만들어 주는 것이다. ravel은 몰라도 resahpe를 할 줄 알면 된다. 편한 점은 사이즈를 명시하지 않아도 된다는 것이다.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html?highlight=ravel

 

numpy.ravel — NumPy v1.16 Manual

Parameters: a : array_like Input array. The elements in a are read in the order specified by order, and packed as a 1-D array. order : {‘C’,’F’, ‘A’, ‘K’}, optional The elements of a are read using this index order. ‘C’ means to index the elements in row-m

docs.scipy.org

 

주로 NN학습을 할 때 사용한다. 3차워을 NN에 바로 넣어주지 않고 1차원으로 만들어서 넣어준다.

 

 

flatten은 NumPY의 모듈 함수가 아니기 때문에 np.flatten으로 사용할 수 없다. ndarray 객체의 메서드로만 사용할 수있다. reval과 동일한 결과를 나타낸다. 

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html?highlight=flatten

 

numpy.ndarray.flatten — NumPy v1.16 Manual

Parameters: order : {‘C’, ‘F’, ‘A’, ‘K’}, optional ‘C’ means to flatten in row-major (C-style) order. ‘F’ means to flatten in column-major (Fortran- style) order. ‘A’ means to flatten in column-major order if a is Fortran contiguous in memory, row-major or

docs.scipy.org

 

  • ravel()과 flatten()의 차이점

flatten은 객체의 메서드로만 사용가능

ravel은 뷰(참조)를 반환, flatten은 복사본을 반환

 

 

 

  • 연결(numpy.concatenate)

https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html?highlight=concatenate

 

numpy.concatenate — NumPy v1.16 Manual

Parameters: a1, a2, … : sequence of array_like The arrays must have the same shape, except in the dimension corresponding to axis (the first, by default). axis : int, optional The axis along which the arrays will be joined. If axis is None, arrays are flat

docs.scipy.org

 

 

다차원 배열 연산

기본적인 수학함수는 배열의 각 요소별로 동작하며 연산자를 통해 동작하거나 numpy함수 모듈을 통해 동작한다.

다차원 배열간 연산 시 shape가 맞아야 연산이 이루어진다.

- 요소별 합, 차, 곱, 나눗셈의 경우 shape가 일치해야 함

- dot의 경우 앞 배열의 열과 뒤 배열의 행의 크기가 일치해야 함

다차원 배열의 연산

 

다차원 배열의 연산 결과

 

NumPY에서는 벡터의 내적, 베터와 행렬의 곱, 행렬곱을 위해 *대신 dot 함수들을 사용한다. dot은 NumPY 모듈 함수또는 배열 객체의 메소드로서도 이용 가능한 함수이다.

dot함수는 인자값에 따라 명칭도 달라진다.

 

Posted by 생짜
|