ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Numpy
    BoostCourse 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

    댓글

Designed by Tistory.