Numerical Python - numpy 2
Handling shape
Reshape
- Array의 shape의 크기를 변경함
- element의 갯수는 동일
test_matrix = [[1, 2, 3, 4], [5, 6, 7, 8]]
print(np.array(test_matrix).shape)
# (2, 4)
print(test_matrix.shape)
# AttributeError: 'list' object has no attribute 'shape'
np.array(test_matrix).reshape(8,)
# [1, 2, 3, 4, 5, 6, 7, 8]
# (8,)
np.array(test_matrix).reshape(-1, 2).shape
# -1 : 나머지 값에 맞게 자동으로 설정
Flatten
- 다차원 array를 1차원 array로 변환
test_matrix = [[[1, 2, 3, 4],[1, 2, 3, 4]], [[1, 2, 3, 4],[1, 2, 3, 4]]]
np.array(test_matrix).flatten()
# array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, ])
Indexting & Slicing
- list와 달리 이차원 배열에서 [0, 0] 표기법을 제공함
- matrix일 경우 앞은 row 뒤는 column을 의미함
a = np.array([[1, 2, 3], [4.5, 5, 6]],int)
print(a[0,0])
print(a[0][0])
# 1
# 1
slicing for numpy array
- list와 달리 행과 열 부분을 나눠서 slicing이 가능함 ```python a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]],int) a[:, 2:] # [[3, 4, 5], [8, 9, 10]] a[1, 1:3] # [7, 8] a[1:3] # [6, 7, 8, 9, 10]
test_example[1] # array([6, 7, 8, 9, 10]) # 1 diension test_example[1:3] # array([[6, 7, 8, 9, 10]]) # 2 dimension
| 0 | 1 | 2 | 3 | 4 |
|----|----|----|----|----|
| 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 |
```python
arr[:,::2]
| 0 | 2 | 4 | |—-|—-|—-| | 5 | 7 | 9 | | 10 | 12 | 14 |
arr[::2, ::3]
| 0 | 3 | |—-|—-| | 10 | 13 |
Creation function
arange
- array의 범위를 지정하여, 값의 list를 생성하는 명령어
np.arange(30) # array([0, 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]) np.arange(0, 5, 0.5) # (시작, 끝, 스텝) # array([0, 0.5, 1, 1.5, 2.5, 3.5, 4.5]) np.arange(30).reshape(5, 6) # array([0, 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]])
ones, zeros, empty
- ones : 1로 가득찬 ndarray 생성
- zeros : 0으로 가득찬 ndarray 생성
- empty : shape만 주어지고 비어있는 ndarray 생성
- memory initialization이 되지 않음
something_like
- 기존의 ndarray의 shape 크기 만큼 1, 0 또는 empty array를 반환
test_matrix = np.arange(30).reshape(5, 6) np.ones_like(test_matrix) # (5, 6) shape의 1로 가득찬 ndarray 반환
identity
- 단위 행렬(i 행렬)을 생성함
np.identity(n=3, dtype=np.int8) np.identity(5)
eye
- 대각선이 1인 행렬, k값의 시작 index 변경 가능
```python
np.eye(3)
array([[1, 0, 0], [0, 1, 0], [0, 0, 1])
np.eye(3, 5, k-2)
| 0 | 0 | 1 | 0 | 0 |
|----|----|----|----|----|
| 0| 0| 0 | 1 | 0 |
| 0 | 0 | 0| 0 | 1 |
### diag
- 대각 행렬의 값을 추출함
```python
matrix = np.arange(9).reshape(3, 3)
np.diag(matrix)
# array([0, 4, 8])
np.diag(matrix, k=1)
# array([1, 5])
| 0 | 1 | 2 | |—-|—-|—-| | 3 | 4 | 5 | | 6 | 7 | 8 |
random sampling
- 데이터 분포에 따른 sanmpling으로 array를 생성 ```python np.random.uniform(0,1,10).reshape(2, 5) # 균등 분포
np.random.normal(0,1,10).reshape(2, 5) # 정규 분포
## Operation function
### sum, mean, std, var
- sum : ndarray의 element들 간의 합을 구함, list의 sum 기능과 동일
- mean : ndarray의 element들의 평균값을 구함
- std : ndarray의 element들의 표준편차를 구함
- var : ndarray의 element들의 분산을 구함
### axis
- 모든 operation function을 실행할 때 기준이 되는 dimension 축
```python
(4,) -> (3, 4) -> (3, 3, 4)
# axis : 0 -> 0, 1 -> 0, 1, 2
concatenate
- numpy array를 붙이는 함수
np.vstack((a, b)) np.hstack((a, b)) np.concatenate((a, b), axis = 0) np.concatenate((a, b.T), axis = 1)
Element-wise operations
- array 간 shape이 같을 때 일어나는 연산
dot product
- 행렬간의 곱
broadcasting
- shape이 다른 배열 간 연산을 지원하는 기능
timeit
- jupyter 환경에서 코드의 퍼포먼스를 체크하는 함수
%timeit scalar_vector_product(scalar, vector)
%timeit np.arange(iteration_max)*scalar
- 일반적으로 속도는 for loop < list comprehension < numpy
- 100,000,000번의 loop이 돌 떄, 약 4배 이상의 성능 차이를 보임
- numby는 c로 구혀녀되어 있어, 성능을 확보하는 대신, 파이썬의 dynamic typing을 포기함
- concatenate처럼 계산이 아닌, 할당에서는 연산 속도의 이점이 없음
댓글남기기