ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5. Changing ndarrays
    공부/likelion 2021. 9. 30. 19:44

    오늘은 어제 적었던 ndarray의 메타 데이터 중

    ndarray.shape, ndarray.itemsize와 관련된 세부 사항들을 적어보고자 한다.

    • ndarray.reshape
    • ndarray.resize
    • ndarray.flatten
    • ndarray.ravel
    • ndarray.astype
    • ndarray.bool 

    1.ndarray.reshape

    배열의 원소를 유지한 채, 다시(re), 형태(reshape)를 지정하는 함수이다.

    a = np.arange(12)
    b = np.reshape(a, (2, 6))
    
    print(a)
    print(b)

    2차원으로 변경!

    이런 식으로 기존에 있는 배열의 차원을 바꿔준다.

    a = np.arange(12)
    b = np.reshape(a, (2, 3, 2))
    
    print(a)
    print(b)

    3차원으로 변경!

     

    그렇다면 -1은 어떻게 작동할까? 한번 입력해보자.

    a = np.arange(12)
    b = np.reshape(a, (2, -1, 2))
    
    print(a)
    print(b)

    자동으로 숫자를 채워주는 걸 알 수 있다.

    다만 이런 경우도 작동할까?

    a = np.arange(12)
    b = np.reshape(a, (2, -1,-1))
    
    print(a)
    print(b)

    얄짤 없다. 값 하나를 잘 모를 때 써먹는 게 좋을 거 같다.

     

    2. ndarray.resize

    이 함수는 reshape와 동일하지만 미묘한 차이점이 있다.
    바로 내부 원소의 갯수보다 크게 입력했을 때도 작동한다는 것.

    우선 기본적인 작동부터 알아보자.

    a = np.arange(12)
    b = np.reshape(a, (2, 3, 2))
    c = np.resize(a, (2, 3, 2))
    
    print(b)
    print(c)

    똑같이 작동하는 것을 볼 수 있다.

    이번에는 차이점에 대해 알아보자.

    a = np.arange(12)
    b = np.reshape(a, (2, 3, 4))
    
    print(b)

    이처럼 크기가 맞지 않은 경우에는 reshape는 작동하지 않지만,

    a = np.arange(12)
    b = np.resize(a, (2, 3, 3))
    
    print(b)

    resize의 경우 잘 작동하며, 심지어 배열 내의 원소를 재배치하는 것과 반복하는 것까지 스스로 해버린다.
    그렇기 때문에 본래 있던 원소만 가지고 분석을 하려고 한다면, resize는 피해야할 함수일 것이다.

     

    3. flatten과 ravel, copy와 view

    flatten과 ravel은 기능은 똑같은 함수다.
    어떤 배열을 이 배열에 집어넣는다면, reshape(size, 1)로 만들어버린다. 그러니까 1차원 배열로 만들어버리는 셈이다.

    그렇다면 차이점이 무엇이냐..

    이 둘은 원본이 변하느냐, 변하지 않느냐의 그 차이가 있다.
    그렇다면 원본이 어떻게 변하지 않는 것일까? 당연하게도 복사를 해서 그것을 처리한다. 
    여기서 중요한 점은 원본이 변하냐, 변하지 않느냐가 중요한데

    이것을 통상 얕은 복사, 깊은 복사로 지칭한다.

    우선, 복사란, 값이 담겨져있는 메모리에서 값만 가져와서 다른 메모리 공간에 담는다는 것을 의미한다.

    얕은 복사란, 그 값이 mutable, 즉 바꿀 수 있는 값이면 사본을 바꾼다고 하더라도 원본까지 바뀌는 복사 방식이며,
    깊은 복사란 그 값이 immutable, 바꿀 수 없는 값이면, 사본을 바꾼다고 해도 원본이 바뀌지 않는 복사 방식이다.

    무엇이 바꿀 수 있고, 무엇이 바꿀 수 없는 자료형인지는 다음 글을 참조하자.[1]

     

    어쨌거나 flatten, ravel, copy, view를 정리해보자면

      얕은 복사  깊은 복사 비고
    복사 기능 함수 view copy 원본 변경 됨
    평탄화 기능 함수 ravel flatten 원본 변경 안됨

    이렇게 정리할 수 있다.

    코드로도 알아보자.

    a = np.random.randint(0,10,(2,5))
    b = a.ravel()
    b[0] = -100
    
    print(b.base is a)
    print(a)
    print(b)

    a = np.random.randint(0,10,(2,5))
    b = a.flatten()
    b[0] = -100
    
    print(b.base is a)
    print(a)
    print(b)

    출력 결과를 보면 알겠지만, 2개가 서로 다르다고 답변하고,
    변동된 값이 원본에도 영향을 끼치는지 여부를 확인할 수 있다.

    (ndarray.base 함수는 메모리가 다른 개체에서 가져왔는지 아는지를 확인하고,
    가져왔을 경우 해당 메모리의 값을 view로 생성한다)

    4. ndarray. astype

    데이터의 타입을 변경해주는 함수이다. 이 함수는 .copy형태로 복사하는 걸 주의하자.
    또한 실수부와 허수부가 있는 float를 int로 변경할 경우, 소수점 이하는 버려지고, 마이너스의 경우 0으로 반올림된다.

    a = np.arange(20).reshape((2, 10)) / 10 - 1
    print(a) 
    print(a.dtype)

    이렇게 된 a라는 객체를 int로 데이터 타입을 변경해보자. 정확하게 보기 위해 범위도 다시 선언해줬다.

    a = np.arange(22).reshape((2, 11,)) / 10 - 1
    print(a) 
    print(a.dtype)
    
    a_int = a.astype('int') 
    print(a_int)
    print(a_int.dtype)

    -1, 1.과 1.1만 살아남았을 뿐, 소수 부분은 전부 0이 된 걸 볼 수 있다.

    + 추가 사항

    5. ndarray.boolean 자료형

    numpy에서는 boolean은 python과 다르게 

    ints = np.array([-2, -1, 0, 1, 2])
    floats = np.array([-2.5, -1.5, 0., 1.5, 2.5])
    
    ints2bools = ints.astype(np.bool)
    floats2bools = floats.astype(np.bool)
    print(ints2bools)
    print(floats2bools)

    0은 False로, 그 외에는 True라고 출력된다.

    마치 배열 내의 값이 어떤 값이든 간에 중요하다!라는 의도가 숨어있는 듯하다.

     

    그렇다면 파이썬에서는 어떻게 될까? 음수, 양수, float, int, 0,1로 구분하여 알아보자.

    print(-3 == True, -3 == False) #음수
    print( 3 == True,  3 == False) #1보다 큰 양수
    print(3.14 == True, 3.14 == False) #float
    print( 3 == True,  3 == False) # int

    0과 1은 메모리 구조를 배웠을 때를 기억하면 간단하다.

    print(0 == True, 0 == False) #0
    print(1 == True, 1 == False) #1


    레퍼런스 

    [1]

     

    Mutable vs Immutable Objects in Python

    Everything in Python is an object. And what every newcomer to Python should quickly learn is that all objects in Python can be either…

    medium.com

Designed by Tistory.