티스토리 뷰

Numpy를 복습했다.

import numpy as np 

 

◎ 연산 속도 비교 

my_arr = np.arange(1000000)
my_list = list(range(1000000))

백만 개의 정수를 저장하는 numpy 배열과 list를 각각 하나씩 만들었다. 

그런 다음 numpy 배열과 list 각각에 2를 곱하는 함수를 정의하고 연산에 걸리는 시간을 측정한다. (%)

%time for _ in range(10): my_arr2 = my_arr * 2
%time for _ in range(10): my_list2 = [x * 2 for x in my_list]

사용하는 개발환경마다 속도는 다르겠으나 내 경우에는 32.4 ms / 1.11s로 전자가 월등히 빠른 것을 확인할 수 있었다. 

 


◎ ndarray의 생성, 변환

array 함수로 배열을 생성할 수 있고, 리스트를 배열로 변환할 수 있다. 

data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)

리스트를 배열화하면 .dtype 메서드로 type을 확인할 수 있다. 

data1.dtype
arr1.dtype

전자는 에러가 나지만 후자는 dtype('int32')라고 알려준다. 

 

 


◎ 명시적 변환 casting 

.astype 메서드로 배열의 dtype을 명시적 형변환할 수 있다. 

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

int32 dtype 배열을 float64형 dtype으로 변환하였다. 

float_arr = arr.astype(np.float64)
float_arr.dtype

astype을 활용해 숫자 형식의 문자열을 담은 배열을 숫자형 배열로 변환할 수도 있다. 

numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
numeric_strings.astype(float)

다루고자 하는 데이터가 숫자 내용의 문자열 데이터인 경우 유용할 듯. 

 


◎ 조각과 전파 slicing and broadcasting

배열을 잘라낸 다음에 스칼라값을 대입하면 대입값을 선택 영역 전체로 전파할 수 있다.

※리스트와의 차이점: 배열 조각은 데이터를 복사하는 것이 아니라 원본에 대한 뷰이므로, 뷰를 변경하면 원본 배열에 변경이 반영된다. 

arr = np.arange(10)
arr[5:8] = 12

먼저 0부터 9까지의 정수를 가지는 배열을 생성한 다음 arr[5]부터 arr[7]까지의 세 원소를 12로 대체한다.

arr_slice = arr[5:8]
arr_slice
arr_slice[1] = 12345
arr

arr[5:8]을 arr_slice로 정의한 다음 arr_slice를 확인해 보면 5, 6, 7이 모두 12로 변경된 것을 확인할 수 있다. 

또 arr_slice의 첫 번째 원소를 12345로 바꾼 다음 원본 배열 arr을 호출하면 6이 12에서 다시 12345로 바뀌어 있다.

arr_slice[:] = 64
arr_slice = 64

이상은 잘라낸 arr_slice의 모든 원소를 동일한 값으로 바꾸어주는 코드이며 윗줄과 아랫줄 모두 동일하게 작동한다.

 

✔ Numpy는 데이터를 복사하지 않는다는 점에 주목하자. 

만약 데이터를 복사하고 싶다면 .copy() 메서드를 활용하여 명시적으로 배열을 복사해야 한다.

arr.copy()
arr[5:8].copy()

 이런 식의 사용이 가능할 것이다.