-
NumpyBoostCourse 2023. 1. 5. 01:06
오늘은 BoostCourse에서 Numpy에 대해 배웠다.
From TEAMLAB director 최성철
Corsera에서 Andrew Ng의 ML을 수강할 때 배운 내용이기에 비교적 쉽게 들을 수 있었다.
앞으로 수학적인 강의가 여럿 남았는데, 기초 확률 및 통계는 내 주전공인 심리학 수업 필수 과정이고, 미적분학은 Khanacademy.com에서, 선형대수는 Math Mart 황한순 선생님 동영상에서 배웠기에 어렵지 않게 들을 수 있을 것 같다.
Numpy는 Numerical Python의 약자라고 한다.
Numpy의 장점은 일반 List에 비해 빠르고 메모리 효율적이라는 것이다.
1. numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)
object에는 scalar, vector, matrix, n-tensor를 list 형태로 넣어준다.
dtype에는 int8, float32 등 object의 data type을 넣어준다.
** numpy는 dynamic typing이 지원되지 않는다.
2. .shape, .ndim, .size, .dtype, .nbytes
shape: 형태를 반환한다.
ndim: 차원의 개수를 반환한다.
size: element의 개수를 반환한다.
dtype: element의 data type을 반환한다.
nbytes: ndarray object의 메모리 크기를 반환한다.
3. .reshape, .flatten
reshape: array의 shape의 크기를 변경한다.
flatten: 다차원 array를 1차원 array로 변환한다. reshape의 하위기능을 따로 떼 내었다고 볼 수 있다.
** array.reshape(-1)은 array.flatten()과 같다.
4. indexing
array[0][0] == array[0,0]
** 여기서 기본 상식 **
1차원: (열,)
2차원: (행, 열)
3차원: (깊이, 행, 열)
...
2차원: 행 - axis = 0, 열 - axis = 1
3차원: 깊이 - axis = 0, 행 - axis =1, 열 - axis = 2
...
순서로 증가한다.
5. slicing
array의 부분 집합을 추출하는 데 유용하다.
test_example = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) test_example
array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]])
test_example[:, 1:3]
array([[ 2, 3], [ 6, 7], [10, 11]])
:: 건너뛰기
test_example[::2, ::3]
array([[ 1, 4], [ 9, 12]])
5. .arange, .zeros, .ones, .empty, .somthing_like, .identity, .eye, .diag
numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)
np.arange(1, 10, 2)
array([1, 3, 5, 7, 9])
numpy.zeros(shape, dtype=float, order='C', *, like=None)
- 0 생성
numpy.ones(shape, dtype=None, order='C', *, like=None)
- 1 생성
numpy.empty(shape, dtype=None, order='C', *, like=None)
- shape만 주어지고 비어있는 array 생성 (memory initialization이 되지 않음)
np.zeros(shape=(2,5), dtype=np.int8)
array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], dtype=int8)
numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)
numpy.ones_like(a, dtype=None, order='K', subok=True, shape=None)
numpy.empty_like(a, dtype=None, order='K', subok=True, shape=None)
- 기존 array의 shape 크기만큼 0, 1, empty array를 반환
test_matrix = np.arange(30).reshape(5,6) np.empty_like(test_matrix, float)
array([[1.30928145e-311, 1.01283457e-321, 0.00000000e+000, 0.00000000e+000, 2.24151479e+174, 1.16097020e-028], [1.26087994e-076, 2.42245819e-028, 5.63485610e-062, 1.04917183e-153, 5.23081515e-143, 6.70962513e+170], [2.34402550e-056, 4.08673065e-033, 4.98409669e-037, 1.70098498e+256, 5.49109388e-143, 1.06396443e+224], [3.96041428e+246, 1.16318408e-028, 2.23147941e+160, 2.14622056e+184, 1.35132190e+161, 4.79584763e-037], [1.01848862e+248, 1.16096643e-028, 9.80058441e+252, 7.50189709e+247, 1.14484251e+243, 2.59903827e-144]])
numpy.identity(n, dtype=None, *, like=None)
- 단위행렬 생성
numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, like=None)
- 주대각선 성분이 1이고 나머지가 0인 행렬 생성
numpy.diag(v, k=0)
- 대각 행렬의 값을 추출
** random sampling **
random.uniform(low=0.0, high=1.0, size=None)
random.normal(loc=0.0, scale=1.0, size=None)
loc - centre
scale - standard deviation
np.random.normal(loc=0, scale=2, size=10)
array([-1.81845436, -0.92821899, -1.5744514 , 3.3301544 , -2.68244799, 1.50278034, 1.40916071, -2.22539554, 2.80038707, 0.17911679])
6. sum, mean, std 등
numpy.sum(a, axis=None, dtype=None, out=None, keepdims=, initial=, where=)
numpy.mean(a, axis=None, dtype=None, out=None, keepdims=, *, where=)
numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=, *, where=)
7. array operations
array 간 shape이 같을 경우: element-wise operation (+, -, *, /)
array 간 shape이 다를 경우: broadcasting
numpy.dot(a, b, out=None)
numpy.transpose(a, axes=None)
** 여기서 기본 상식 **
timeit을 사용하면 jupyter 환경에서 코드의 퍼포먼스를 체크할 수 있다.
def scalar_vector_product(scalar, vector): result = [] for value in vector: result.append(scalar * value) return result iteration_number = ? vector = list(range(iteration_number)) scalar = 3 %timeit scalar_vector_product(scalar, vector) %timeit [scalar * value for value in range(iteration_number)] %timeit np.arange(iteration_number) * scalar
iteration_number = 100일 때
21.8 µs ± 819 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) 16.3 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 100,000 loops each) 4.68 µs ± 359 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
iteration_number = 10000000
3.01 s ± 202 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 2.5 s ± 82.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 62.2 ms ± 1.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
iteration_number를 과도하게 늘리면 MemoryError가 뜨거나 튕기므로 유의
8. .vstack, .hstack, .concatenate
numpy.vstack(tup, *, dtype=None, casting='same_kind')
a = np.array([1,2,3]) b = np.array([4,5,6]) np.vstack((a,b))
array([[1, 2, 3], [4, 5, 6]])
numpy.hstack(tup, *, dtype=None, casting='same_kind')
a = np.array([[1],[2],[3]]) b = np.array([[4],[5],[6]]) np.hstack((a,b))
array([[1, 4], [2, 5], [3, 6]])
numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
- axis=0일 경우 vstack과 유사한 역할을 한다.
a = np.array([[1,2,3]]) b = np.array([[4,5,6]]) np.concatenate((a,b), axis=0)
array([[1, 2, 3], [4, 5, 6]])
그러나 vstack 예제에서 a.shape >> (3,)이지만 concatenate 예제에서 a.shape >> (1,3)임을 유의하라.
concatenate 예제에서 a와 b의 shape이 (3,)인 경우에는 다음 결과값이 출력되었다.
array([1, 2, 3, 4, 5, 6])
- axis = 1일 경우 hstack과 유사한 역할을 한다.
a = np.array([[1],[2],[3]]) b = np.array([[4],[5],[6]]) np.concatenate((a,b), axis=1)
array([[1, 4], [2, 5], [3, 6]])
9. comparisons
numpy.any(a, axis=None, out=None, keepdims=, *, where=)
a = np.array([1,2,3,4,5]) np.any(a>3)
True
numpy.all(a, axis=None, out=None, keepdims=, *, where=)
a = np.array([1,2,3,4,5]) np.all(a>3)
False
comparison operation은 element-wise operation과 broadcasting이 동일하게 적용된다.
numpy.logical_and(x1, x2)
- x1과 x2가 모두 True이면 True 반환
numpy.logical_or(x1, x2)
- x1과 x2 중 하나가 True이면 True 반환
numpy.logical_not(x)
- x가 True이면 False를, False이면 True 반환
numpy.where(condition, [x, y, ]/)
condition: Where True, yield x, otherwise yield y.
[x, y, ]가 주어지지 않으면 Index 값을 반환
** 여기서 기본 상식 **
numpy에서는 np.NaN과 np.Inf 값을 지원한다.
np.NaN: 값이 할당되지 않음
np.Inf: 값이 무한대로 발산함
numpy.isnan(x)
- np.NaN일 경우 True 반환
numpy.isfinite(x)
- finite number일 경우 True 반환
numpy.argmax(x)
- array 내 최대값의 index 반환
numpy.argmin(x)
- array 내 최소값의 index 반환
numpy.argsort(x)
- Returns the indices that would sort an array.
10. boolean index, fancy index
boolean index
test_array = np.arange(10) condition = test_array > 5 test_array[condition]
array([6, 7, 8, 9])
fancy index
test_array = np.arange(1,10,2) condition = np.array([0,0,0,1,1,1]) test_array[condition] # test_array.take(condition)과 동일하다
array([1, 1, 1, 3, 3, 3])
** matirx 형태의 데이터도 가능하다.
a = np.arange(4).reshape(2,2) * 4 b = np.array([0,0,1,1,0]) c = np.array([0,1,0,1,0]) a[b,c]
array([ 0, 4, 8, 12, 0])
11. numpy data i/o
파일호출
load_file = np.loadtxt("./file_name.txt")
파일저장
np.savetxt('new_file_name.csv', load_file, delimiter=",")
실습
f = open("np_test.txt", mode="w", encoding="utf8") for i in range(0, 10): for j in range(0,10): number = i * 10 + j f.write("%d " % (number)) f.write("\n") f.close()
load_file = np.loadtxt("./np_test.txt") new_file = load_file[:][3:6] np.savetxt('new_np_test.csv', new_file, delimiter=" ")
이 많은 양을 가르치시는 데 1시간 30분이 걸렸다. 복습하고 정리하는 데 3시간이 넘게 걸렸다. 하하.
논문 투고는 언제하지. 당분간 힘든 하루하루가 될 것 같다.
'BoostCourse' 카테고리의 다른 글
행렬은 뭔가요? (0) 2023.01.07 벡터가 뭐에요? (0) 2023.01.05 Exception/File/Log Handling (0) 2023.01.02 Module and Project (0) 2023.01.02 Python Object Oriented Programming (0) 2022.12.31