Numpy
Numpy는 수학, 과학 계산용 패키지입니다. 자료구조를 제공하고 있으, 그 중 ndarray는 파이썬의 list보다 속도가 더 빠름과 적은 메모리를 사용한다는 특징이 있습니다.
ndarray
ndarray는 Numpy의 핵심 구조로, Numpy에서 사용되는 데이터 배열입니다. 파이썬의 list를 ndarray로 변환하는 방법은 아래와 같습니다.
import numpy as np
list1 = [1, 2, 3, 4]
list2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
# 리스트를 ndarray로 변환
ndarr1 = np.array(list1)
ndarr2 = np.array(list2)
print(ndarr1)
# [1 2 3 4]
print(ndarr2)
'''
[[1, 2, 3, 4],
[5, 6, 7, 8]]
'''
ndarray의 data type
ndarray는 list와 달리 1개 단일 데이터 타입만 허용합니다.
import numpy as np
# 데이터 타입이 int인 ndarray
ndarr1 = np.array([1, 2, 3, 4])
print(ndarr1.dtype) # int64
# 데이터 타입이 float인 ndarray
ndarr2 = np.array([1, 2, 3.14, 4])
print(ndarr1.dtype) # float64
# 데이터 타입이 string인 ndarray
ndarr3 = np.array(['1', '2', '3.14', 'True'])
print(ndarr3.dtype) # <U4
ndarray 슬라이싱
ndarray의 슬라이싱은 리스트의 슬라이싱과 비슷합니다.
import numpy as np
ndarr1 = np.array(['🍎','🍒','🍓','🍎','🥭'])
# 인덱싱
print(ndarr1[0]) # 🍎
print(ndarr1[4]) # 🥭
print(ndarr1[-1]) # 🥭
print(ndarr1[-2]) # 🍎
# 슬라이싱
print(ndarr1[0:3]) # ['🍎' '🍒' '🍓']
print(ndarr1[2:]) # ['🍓' '🍎' '🥭']
print(ndarr1[:3]) # ['🍎' '🍒' '🍓']
Fancy 인덱싱
슬라이싱 대신 여러 특정한 인덱스의 값을 동시에 얻을 수 있는 Fancy 인덱싱을 사용할 수 있습니다.
import numpy as np
ndarr1 = np.array([10, 15, 2, 8, 20, 90, 85, 44, 23, 32])
idx = [2, 5, 9]
ndarr1[idx] # [2, 90, 32]
Boolean 인덱싱
조건에 대한 필터링을 통해 Boolean 값을 이용한 색인을 사용할 수 있습니다.
import numpy as np
ndarr1 = np.array(['🍎','🍒','🍓','🍎','🥭'])
selValue = [True, False, True, True, False]
ndarr1[selValue] # ['🍎', '🍓', '🍎']
ndarr2d = np.array1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
print(ndarr2d[ndarr2d > 7]) # [ 8 9 10 11 12]
arange
순차적인 값을 생성할 때 사용하는 arange 함수는 range 함수와 유사합니다.
import numpy as np
arr2 = np.arange(1, 11)
for i in arr2:
print(i, end=" ") # 1 2 3 4 5 6 7 8 9 10```
### sort
`sort` 함수를 이용하면 ndarray를 정렬할 수 있습니다.
```python
import numpy as np
ndarr1 = np.array([1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
np.sort(ndarr1) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ndarr2d = np.array([[11,10,12,9],
[3,1,4,2],
[5,6,7,8]])
# 행 정렬
print(np.sort(nd2d, axis=0))
'''
[[ 3 1 4 2],
[ 5 6 7 8],
[11 10 12 9]]
'''
# 열 정렬
print(np(ndarr2d, axis=1))
'''
[[ 9 10 11 12],
[ 1 2 3 4],
[ 5 6 7 8]]
'''
# 열 정렬 내림차순
print(np.sort(ndarr2d, axis=1)[:,::-1])
'''
[[12 11 10 9],
[ 4 3 2 1],
[ 8 7 6 5]]
'''
``### 연산자를 이용한 계산
덧셈, 뺄셈, 곱셈, 나눗셈은 shape가 같아야 하며, 같은 position끼리 연산합니다.
```python
a = np.array([[1,2,3],
[2,3,4],])
b = np.array([[3,4,5],
[1,2,3]])
print(a+b) # [[4 6 8], [3 5 7]]
print(a-b) # [[-2 -2 -2], [ 1 1 1]]
print(a*b) # [[ 3 8 15], [ 2 6 ]]
print(a/b) # [[0.33333333 0.5 0.6 ], [2. 1.5 1.33333333]]
또한 내적(dot product)은 맞닿는 shape가 같아야 하며, 내적은 떨어져 있는 shape가 결과 행렬이 됩니다.
a = np.array([[1,2,3],
[1,2,3],
[2,3,4]])
b = np.array([[1,2],
[3,4],
[5,6]])
print(np.dot(a,b))
'''
[[22 28]
[22 28]
[31 40]]
'''