[Python] Numpy Tutorial 파이썬 넘파이 실습 2

지난 번에 w3schools에서 Numpy Tutorial을 보며 넘파이 실습을 했었다. 이번 포스팅에서 이어서 실습 할 예정이다.

NumPy Array Slicing

배열 슬라이싱(Slicing arrays)

슬라이싱은 배열을 나누는 함수다.

슬라이싱의 인자는 [start:end]의 형태로 나타낼 수 있고, end 뒤에 step라는 인자를 선택적으로 추가할 수 있다. 추가한 슬라이싱의 형태는 [start:end:step]으로 나타난다. 만약 start가 0이거나, end가 슬라이싱 할 배열의 크기보다 크거나, step가 1일 때 오류가 발생한다.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7])

print(arr[1:5])

#결과
[2 3 4 5]

결과는 start 인덱스를 포함하고 end 인덱스는 포함하지 않는다고 한다.

따라서 위 코드의 결과는 [2 3 4 5]로 나타난다. 1번 인덱스인 2(포함)부터 end의 인자가 5이기 때문에 5의 인덱스를 지칭하는 6 이전까지의 배열을 출력한다.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7])

print(arr[4:])

#결과
[5 6 7]

만약 start 인덱스만 있고 end 인덱스를 공백으로 채운다면 start에 넣은 인덱스를 포함해서 배열의 끝까지 출력한다.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7])

print(arr[:4])

#결과
[1 2 3 4]

만약 start 인덱스를 공백으로 채우고 end 인덱스만 존재한다면 처음부터 end 인덱스의 이전까지 출력한다.

음수 인자 배열 슬라이싱(Negative Slicing)

Indexing에서 실습했던 것처럼 인자에 음수를 넣었을 때의 슬라이싱 실습이다.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7])

print(arr[-3:-1])

시작이 start, end라고 하였다. 그러면 start의 인덱스가 -3인데 배열에서 0번째 인덱스는 1이므로 -3번째 인덱스는 5라는 것을 알 수 있다. -1도 똑같이 풀이하면 7이라는 것을 알 수 있는데 end의 값이므로 앞의 값인 6까지 출력해야 한다. 따라서 결과는 [5 6]이 출력된다.

스텝(STEP)

처음에 말했었던 step인자 실습 목차다.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7])

print(arr[1:5:2])

#결과
[2 4]

arr[1:5:2]에서 step 인자 부분은 ‘2’이다. 먼저 start는 1, end는 5이다. 만약 step을 제외한다면 나오는 결과는 [2, 3, 4, 5]가 나오게 된다. step 인자는 얼만큼 슬라이싱 할 지를 결정하는 인자인데, 위 코드에서는 2이므로 결과는 [2 4]가 출력된다. 시작 인덱스에서 시작하여 두 번 건너간다고 생각하니 이해하기 쉬웠던 것 같다.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7])

print(arr[::2])

위 코드도 step 실습 예시인데 보면 start와 end의 인자가 공백 상태이다. 위에서 실습했던 것처럼 start의 공백은 ‘처음부터’, end의 공백은 ‘끝까지’이므로 위 코드에서는 step만 신경쓰면 된다. 인덱스 0부터 2칸씩 건너서 출력된다고 예상 할 수 있다. 따라서 결과는 [1 3 5 7]가 출력된다.

2차원 배열 슬라이싱(Slicing 2-D Arrays)

2차원 배열 슬라이싱 실습 목차다.

import numpy as np

arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])

print(arr[1, 1:4])

이전 포스팅에서 arr[]안에 ‘,’는 배열을 선택하는 형식이었다. 위 코드에서도 똑같이 하면 될 듯하다. 1이 먼저 와있으니 1번째 1차원 배열을 선택하여 인덱스 1부터 4이전까지를 출력하는 코드인 것이다. 따라서 결과가 [7 8 9]가 출력된다.

import numpy as np

arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])

print(arr[0:2, 2])

2차원 배열 슬라이싱 두번째 실습 예시 코드다. 위 코드에서는 start가 0이고 end가 2로 설정되었기 때문에 0과 1의 인덱스의 배열을 선택한다(슬라이싱). 뒤에 있는 숫자 ‘2’는 인덱스이다. 각 배열에서 두 번째 인덱스를 꺼낸다.

다른 예시를 하나 더 들자면

import numpy as np

arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],[11, 12, 13, 14, 15]])

print(arr[0:3, 3])

위 코드는 3개의 배열이 있는 2차원 배열이다. 각 배열을 모두 선택하기 위해 슬라이싱을 0:3으로 설정하고 각 배열의 3번째 인덱스를 추출하기위해 뒤에 인자를 3으로 설정한다. 결과는 [ 4 9 14]가 출력된다.

import numpy as np

arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])

print(arr[0:2, 1:4])

위 코드가 마지막 실습이다. 먼저 2차원 배열을 0부터 2까지 슬라이싱 한다. start가 0, end가 2이므로 0과 1의 인덱스 배열이므로 모든 배열이 포함된다. 다음엔 각 배열을 1:4로 슬라이싱한다. 결과는 [[2 3 4] [7 8 9]] 로 출력된다.

NumPy Data Types

파이썬에서의 데이터 타입(Data Types in Python)

파이썬에서의 데이터 타입:

  • 문자열 (strings): 텍스트 데이터를 나타내며, 큰따옴표나 작은따옴표로 감싸서 표현합니다. 예: “ABCD”.
  • 정수 (integer): 정수 숫자를 나타내며, 음수와 양수를 모두 포함합니다. 예: -1, 0, 42.
  • 부동소수점 (float): 실수를 나타내며, 소수점을 포함하는 숫자입니다. 예: 1.2, 42.42.
  • 불리언 (boolean): 참(True) 또는 거짓(False) 값을 나타냅니다. 조건문에서 주로 사용됩니다.
  • 복소수 (complex): 복소수를 나타내며, 실수부와 허수부로 구성됩니다. 예: 1.0 + 2.0j.

넘파이에서의 데이터 타입(Data Types in NumPy)

numpy에서의 데이터 타입:

  • i (integer): 정수형 데이터. 예: -1, 0, 42.
  • b (boolean): 불리언형 데이터. 참(True) 또는 거짓(False).
  • u (unsigned integer): 부호 없는 정수형 데이터. 예: 0, 1, 2.
  • f (float): 부동소수점형 데이터. 예: 1.2, 3.14.
  • c (complex float): 복소수형 데이터. 예: 1.0 + 2.0j.
  • m (timedelta): 시간 간격을 나타내는 데이터 유형.
  • M (datetime): 날짜와 시간을 나타내는 데이터 유형.
  • O (object): 일반 객체를 나타내는 데이터 유형.
  • S (string): 바이트 문자열을 나타내는 데이터 유형.
  • U (unicode string): 유니코드 문자열을 나타내는 데이터 유형.
  • V (void): 특정 타입이 없는 고정 크기 메모리 블록을 나타냅니다.

배열 타입 체크하기(Checking the Data Type of an Array)

import numpy as np

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

print(arr.dtype)

numpy로 만든 배열안에 숫자가 있다. dtype을 사용하면 배열의 데이터 타입을 알 수 있는데, 위 코드를 출력하면 int64가 출력된다.

import numpy as np

arr = np.array(['apple', 'banana', 'cherry'])

print(arr.dtype)

numpy로 만든 배열안에 문자열이 있다. 마찬가지로 dtype을 사용하여 배열의 데이터 타입을 알 수 있는데, 위 코드를 출력하면 유니코드 문자열을 나타내는 <U6이 출력된다.

데이터 타입 정의하며 배열 생성하기

import numpy as np

arr = np.array([1, 2, 3, 4], dtype='S')

print(arr)
print(arr.dtype)

#결과
[b'1' b'2' b'3' b'4']
|S1

배열을 선언할 때 배열의 차원을 설정 할 수 있던 것처럼 배열을 생성할 때 데이터 타입을 설정 할 수 있다. S는 바이트 문자열을 나타내는 데이터 타입인데 기본적으로 1바이트의 크기를 의미한다. 데이터 타입을 선언하며 배열을 생성하면 정수 배열이 바이트 문자열로 변환된다. 따라서 각 정수는 바이트 문자열로 변환되어 ‘[b’1′ b’2′ b’3′ b’4′]’로 저장된다. 이때 b는 바이트 문자열임을 의미한다. 위 코드를 실행하면 저장된 문자열 [b’1′ b’2′ b’3′ b’4’]이 출력되고 데이터 타입은 S이고 크기가 1이므로 ‘S1’이 출력된다.

import numpy as np

arr = np.array([1, 2, 3, 4], dtype='i4')

print(arr)
print(arr.dtype)

#결과
[1 2 3 4]
int32

위 코드에서 선언한 ‘i4’는 int형 4바이트(32비트) 정수를 나타내며, 이는 [1, 2, 3, 4]의 정수 배열을 32비트 정수 배열로 저장 했기 때문에 [1, 2, 3, 4] int32가 출력된다.

데이터 타입 변환에서 발생하는 에러

valueError부분이다.

import numpy as np

arr = np.array(['a', '2', '3'], dtype='i')

위 코드는 배열안에 문자열이 들어있는데 정수형으로 데이터 타입을 지정하여 오류가 발생한 상황이다.

이미 존재하는 배열 데이터 타입 변환

배열의 데이터 타입을 바꾸는 가장 좋은 방법은 배열을 복사하여서 만드는 astype() 메소드다. astype() 메소드의 기능은 먼저 배열을 복사하고 복사된 배열에 데이터 타입을 지정하는 것이다.

import numpy as np

arr = np.array([1.1, 2.1, 3.1])

newarr = arr.astype('i')

print(newarr)
print(newarr.dtype)

위 코드의 출력 결과는 [1 2 3] int32로 나타난다. 기존에 float 타입이었던 배열을 정수형으로 바꿔 소수점이 제거되었다. 그리고 newarr의 데이터 타입도 고친 것처럼 int32로 나타나는 것을 볼 수 있다.

import numpy as np

arr = np.array([1.1, 2.1, 3.1])

newarr = arr.astype(int)

print(newarr)
print(newarr.dtype)

#결과
[1 2 3]
int64

이 코드는 astype 안의 인자가 ‘i’가 int로 바뀐 것 밖에 차이점이 없는데 결과가 다르게 나온다. int와 ‘i’는 다르게 나오므로 주의 해야 할 것 같다.

import numpy as np

arr = np.array([1, 0, 3])

newarr = arr.astype(bool)

print(newarr)
print(newarr.dtype)

위 코드에서 0은 false 나머지는 true로 나타난다.

참고 – w3schools

최신글

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.