Numpy란
Numpy는 Numerical Python의 약자로 Numeric과 Numarray라는 두 개의 패키지를 기반으로,
다차원 배열 객체를 컨트롤하는데 이점이 있습니다.
Numpy는 Pandas가 구축된 기본 데이터 구조와 연산을 제공합니다.
Pandas를 사용하는 것인 Numpy도 같이 사용하는 하는 의미입니다.
List와 비교
Numpy를 활용하는 것은 Python List보다 50배 더 빠릅니다.
사용시 메모리에서 연속적인 참조위치로 저장이되므로 액세스시 매우 효율적이고,
최근 CPU와도 최적화가 잘 되어있습니다.
C, C++로 프로그래밍되어 있으며
Numpy를 이용한 array object를 ndarray라고 부릅니다.
예제 )
import numpy as np
array = np.array([[1,2,3], [3,4,5], [7,8,9]])
print(array)
>>>
[[1 2 3]
[3 4 5]
[7 8 9]]
print(type(array))
>>>
<class 'numpy.ndarray'>
print(np.__version__)
>>>
'1.26.2'
Pandas
Numpy를 사용하다 보면 좀 더 복잡한 데이터 구조와 조작이 필요하게 되는데 이 때, Pandas를 사용합니다.
Pandas는 Series와 DataFrame구조를 제공합니다.
Series는 여러 데이터 유형을 저장할 수 있는 1차원 배열과 비슷한 객체이며,
DataFrame은 열이 서로다른 2차원 배열 데이터 구조,
Panel은 3차원 배열 데이터 구조를 지원합니다.
Numpy Function
아래는 기본적인 Numpy에서 제공하는 함수들 입니다.
Copy
기존 array를 복사합니다. view를 사용하면 동일한 참조주소를 복사하여 기존 array 인덱스 값도 같이 변경됩니다.
arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
x[0] = 42
print(x)
>>>
[42 2 3 4 5]
Shape
element 요소 값을 반환합니다. 아래 예제는 2차원 배열의 인덱스들을 표시합니다.
import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr.shape)
>>>
(2, 4)
Reshape
배열의 형태를 바꿉니다.
arr2 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr2.reshape(4, 3)
print(newarr)
>>>
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
# 참조하는 array 확인
print(newarr.base)
>>>
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# reshape로 생성된 array는 copy가 아니라 view로 복사된 array이다.
newarr[0] = 99
print(newarr)
>>>
[[99, 99, 99],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
print(arr2)
>>>
[99, 99, 99, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# 다차원배열을 1차원배열로 변경
newarr.reshape(-1)
print(newarr)
>>>
[99, 99, 99, 88, 88, 88, 7, 8, 9, 10, 11, 12]
Join
sql에서 key를 기준으로 join하는 방면, Numpy에서는 축을 기준으로 join합니다.
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2), axis=0)
print(arr)
>>>
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
arr = np.concatenate((arr1, arr2), axis=1)
print(arr)
>>>
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
Splitting
기존배열을 분리합니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 2)
print(newarr)
>>>
[array([1, 2, 3]), array([4, 5, 6])]
Search
where() : 조건에 해당하는 indexes를 반환합니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 4, 4])
x = np.where(arr == 4)
print(x)
>>>
(array([3, 5, 6]),)
searchsorted() :
첫번째 인자값(A)에 대해, 두번째 인자값(B)이 기존의 (A) 의 어느 index에 놓이게 될지를 반환합니다.
(A)는 정렬이 되어있어야하며, 정렬이 아닌 경우 제대로 된 값을 반환하지 않습니다.
import numpy as np
arr = np.array([6, 7, 8, 10])
x = np.searchsorted(arr, 9)
print(x)
>>>
3
arr = np.array([1, 3, 5, 7])
x = np.searchsorted(arr, [2, 4, 6])
print(x)
>>
[1, 2, 3]
Sort
import numpy as np
arr = np.array(['banana', 'cherry', 'apple'])
print(np.sort(arr))
>>>
['apple' 'banana' 'cherry']
arr = np.array([[3, 2, 4], [5, 0, 1]])
print(np.sort(arr))
>>>
[[2 3 4]
[0 1 5]]
Filter
Boolean List를 통해서 기존 array를 필터링 할 수 있습니다.
import numpy as np
arr = np.array([41, 42, 43, 44])
x = arr[[True, False, True, False]]
print(x)
>>
[41 43]
위의 예시처럼 하드코딩된 Boolean List가 아닌 조건을 이용해서 필터링할 수 도 있습니다.
import numpy as np
arr = np.array([41, 42, 43, 44])
# 필더링 조건 리스트
filter_arr = arr > 43
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
>>>
[False False False True]
[44]
numpy.array는 기존 list와 비슷하게 index를 통해 접근하거나 slice를 하는 등의 사용법은 동일합니다.
그러나 2차원 배열의 컨트롤이나 필터링과 같은 따로 함수를 작성하지 않아도 제공되는 기능들이 많아,
익숙해진다면 데이터 처리하는데 효율적으로 프로그래밍 할 수 있을 것이라 생각됩니다.
참조 :
http://bigdata.dongguk.ac.kr/lectures/Python/_book/pandas.html#pandas-dataframe
https://www.w3schools.com/python/numpy/default.asp
'Programming > Python' 카테고리의 다른 글
Python - zip 활용 (0) | 2024.08.19 |
---|---|
Python - Product vs Permutations vs Combinations (0) | 2024.08.18 |
Python - 클로저와 __call__ 함수 (0) | 2023.06.18 |
Python - 파이썬 코딩의 기술을 통한 클린코딩 (0) | 2023.06.11 |
Python - AES 양방향 암호화 (0) | 2023.03.27 |